随机获取 ExecuteNonQuery 需要一个开放且可用的连接
本文关键字:连接 一个 ExecuteNonQuery 获取 随机 | 更新日期: 2023-09-27 18:19:09
我有一个运行一些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()
保持活动状态,如果这有任何区别。
为每个计时器回调创建一个新的连接对象:
private void MyTimerEventHandler(object src, ElapsedEventArgs a)
{
SqlConnection sqlCon = new SqlConnection( [...]
重用连接通常是一个坏主意。在您的情况下,如果该连接正在另一个线程中使用,则可能会遇到争用条件。创建新连接不应影响性能,因为它们是从连接池中提取的。
您可以在执行查询之前检查连接是否仍然打开
if (sqlCon.State == System.Data.ConnectionState.Open)
{
insCmd.ExecuteNonQuery();
}
else
{
sqlCon.Open();
insCmd.ExecuteNonQuery();
}
}
您不必使用 StringBuilder 准备插入语句并将其作为文本传递给 SQL 命令,以便通过 SQL 服务器发送一次以插入。在这种情况下,对于所有 600 个循环,您将需要连接到数据库一次。只是一个想法