我们有一些客户端代码,使用.NET中的SqlConnection类与SQLServer数据库通信。它偶尔会出现以下错误:"ExecuteReader需要一个打开且可用的连接。连接的当前状态为Closed"。 "临时"解决方案是重新启动进程,之后一切正常 - 然而,这显然是不令人满意的。该代码保留了SqlConnection实例的缓存,每个数据库一个。
我们想要重写代码,但在此之前,我需要知道一些事情:我的第一个问题是:重复连接和断开SqlConnection对象是否低效,还是底层库代表我们执行连接池?
因为我们的代码没有执行上述操作,因此问题的可能原因是在连接的“寿命”期间发生了某些导致连接关闭的底层SQLServer数据库的情况...
如果证明“缓存”SqlConnection对象是值得的,那么处理所有可以通过“重新连接”到数据库简单解决的错误的推荐方式是什么?我所说的情况包括:
- 数据库被脱机并重新联机,但客户端过程在此过程中没有打开任何事务 - 数据库已“断开”,然后“重新连接”
我注意到SqlConnection上有一个“State”属性...有适当的方法来查询它吗?
最后,我设置了一个具有完全访问权限的测试SQLServer实例:如何复制粘贴“ExecuteReader需要打开和可用的连接。连接的当前状态为Closed”的确切错误?
我们想要重写代码,但在此之前,我需要知道一些事情:我的第一个问题是:重复连接和断开SqlConnection对象是否低效,还是底层库代表我们执行连接池?
// Is this bad/inefficient?
for(many-times)
{
using(SQLConnection conn = new SQLConnection(connectionString))
{
// do stuff with conn
}
}
因为我们的代码没有执行上述操作,因此问题的可能原因是在连接的“寿命”期间发生了某些导致连接关闭的底层SQLServer数据库的情况...
如果证明“缓存”SqlConnection对象是值得的,那么处理所有可以通过“重新连接”到数据库简单解决的错误的推荐方式是什么?我所说的情况包括:
- 数据库被脱机并重新联机,但客户端过程在此过程中没有打开任何事务 - 数据库已“断开”,然后“重新连接”
我注意到SqlConnection上有一个“State”属性...有适当的方法来查询它吗?
最后,我设置了一个具有完全访问权限的测试SQLServer实例:如何复制粘贴“ExecuteReader需要打开和可用的连接。连接的当前状态为Closed”的确切错误?