0

SQL 2008バックエンドを備えたC#/。NET4のWindowsフォームアプリがあります。ボタンクリックイベントハンドラーでSqlConnectionを開き、複数のバックグラウンドワーカーを呼び出します。各バックグラウンドワーカーは、usingブロック内で接続のCreateCommandメソッドを呼び出します。

    private void btnSubmit_Click(object sender, EventArgs e)
    {
        cn.Open();
        bw01.RunWorkerAsync(x);
        bw02.RunWorkerAsync(x);
        while (bw01.IsBusy || bw02.IsBusy)
            Application.DoEvents();
        cn.Close();
    }

    private void bw01_DoWork(object sender, DoWorkEventArgs e)
    {
        try
        {
            using (SqlCommand cmd = cn.CreateCommand())
            {
                cmd.CommandText = <some SQL>
                e.Result = Convert.ToInt32(cmd.ExecuteScalar());
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return;
        }
    }

    private void bw02_DoWork(object sender, DoWorkEventArgs e)
    {
        try
        {
            using (SqlCommand cmd = cn.CreateCommand())
            {
                cmd.CommandText = <some SQL>
                e.Result = Convert.ToInt32(cmd.ExecuteScalar());
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return;
        }
    }

コードは機能する場合もありますが、エラーが発生する場合もあります。最も一般的なのは、「現在のコマンドで重大なエラーが発生しました。結果があれば破棄する必要があります」です。

接続文字列にMultipleActiveResultSets=trueが含まれています。私は何が間違っているのですか?

4

2 に答える 2

2

両方のスレッドがそれを使用しようとしているため、接続変数はスレッドセーフではありません。ADO.NETが接続プールを管理するため、接続の作成を各スレッド内に移動してアトミックにする必要があります

于 2012-06-18T04:11:11.727 に答える
0

これらのコマンドは、SELECT(読み取り専用)、INSERT / UPDATE / DELETE、または何になりますか?また、ケースでdataadaptorを使用し、データセットにdataadaptor値を入力することもできます。e.resultをその値に設定します。

これで問題が実際に修正されるわけではありませんが、sqlcommandのCommandTypeも設定することをお勧めします。

于 2012-06-18T04:40:29.187 に答える