2

我有一个运行一些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();
}

Timer此代码在每 15 秒运行一次的事件处理程序中执行。GC.KeepAlive()如果这有什么不同,计时器就会保持活动状态。

4

3 回答 3

2

为每个计时器回调创建一个新的连接对象:

private void MyTimerEventHandler(object src, ElapsedEventArgs a)
{
       SqlConnection sqlCon = new SqlConnection( [...]

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

于 2013-06-19T16:58:01.537 回答
0

您可以在执行查询之前检查连接是否仍然打开

   if (sqlCon.State == System.Data.ConnectionState.Open)
                    {
                        insCmd.ExecuteNonQuery();
                    }
                    else
                    {
                        sqlCon.Open();
                        insCmd.ExecuteNonQuery();
                    }
                }
于 2013-06-19T16:56:52.190 回答
0

您不使用 StringBuilder 准备插入语句并将其作为文本传递给 SQL 命令,以便通过 SQL SERVER 发送一次以进行插入。在这种情况下,对于所有 600 个循环,您将需要连接到 DB 一次。只是一个想法

于 2013-06-19T17:03:55.163 回答