c# - 随机获取 ExecuteNonQuery 需要打开且可用的连接

标签 c# sql sql-server

我有一个循环运行一些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( [...]

重用连接通常不是一个好主意。在您的情况下,如果该连接正在另一个线程中使用,您可能会遇到竞争条件。 创建新连接不应影响性能,因为它们是从连接池中拉出的。

关于c# - 随机获取 ExecuteNonQuery 需要打开且可用的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17196942/

相关文章:

c# - 在 devenv 和 msbuild 中使用 CruiseControl.net 时输出二进制文件的任何差异

c# - 添加新 View 时 ASP.NET MVC4 "resource not found"

mysql - SQL无效使用组函数

SQL Server 给出语法错误

c# - MVC3 HttpStatusCodeResult 在 OnActionExecuted 中不起作用

c# - ASP.NET UDP 套接字代码适用于开发,但不适用于 IIS 的生产

mysql - Impala 正则表达式在管道分隔列表中查找 "2"但不是 "255"

mysql - 顺序 sql 树层次结构

c# - SqlDataAdapter 内部是如何工作的?

sql - 根据纪元算出耗时百分比