我有一个运行一些ExecuteNonQuery
命令的循环。 偶尔它返回的错误信息:随机获取ExecuteNonQuery需要一个开放且可用的连接
ExecuteNonQuery requires an open and available connection. The connections
current state is closed.
这里是我的代码:
private void MyTimerEventHandler(object src, ElapsedEventArgs a)
{
sqlCon = new SqlConnection("server=" + appConfig.sqlServer + ";Trusted_Connection=yes;database=testdb;connection timeout=30;");
sqlCon.Open();
foreach (TagManager tm in tagManagerList)
{
foreach (Tag tag in tm.getTags())
{
SqlCommand insCmd = new SqlCommand("INSERT INTO tag_values (tag_id, value, time) Values (@tagId, @tagValue, @tagTime);", sqlCon);
insCmd.Parameters.Add(new SqlParameter("@tagId", tag.tagNameId));
insCmd.Parameters.Add(new SqlParameter("@tagValue", tag.value));
insCmd.Parameters.Add(new SqlParameter("@tagTime", tag.time));
insCmd.ExecuteNonQuery();
}
}
sqlCon.Close();
}
此代码执行运行每15秒一个Timer
的事件处理程序。如果这有什么区别的话,定时器会保持活跃状态GC.KeepAlive()
。
该代码暗示sqlCon是该类的一个字段。也许在30秒的超时时间内,你有一个新的调用,在先前的调用完成时开始运行,而旧的调用在中途关闭连接? – Mikeb
你钉了它。这是在15秒计时器上触发的,所以如果第一次调用在第二次触发时仍然在运行,那么第一次调用会在第二次调用时关闭连接,导致此问题。这就是为什么你不像这样共享连接对象的原因。 –
请改用(var sqlCon = new SqlConnection(...)){}来代替。如果sqlConn.Open()和sqlConn.Close()之间发生异常,连接将不会正确关闭。 –