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 に答える