我有一個運行一些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()之間發生異常,連接將不會正確關閉。 –