在同一个SqlConnection上多次调用CreateCommand

时间:2012-06-18 04:00:53

标签: c# .net ado.net

我在C#/ .NET4中有一个带有SQL 2008后端的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。我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的连接变量不是线程安全的,因为两个线程都试图使用它。 ADO.NET将为您管理连接池,因此您应该在每个线程内部移动连接并使其成为原子

答案 1 :(得分:0)

这些命令是SELECTs(只读),INSERTs / UPDATEs / DELETE还是什么?您可能还希望在您的案例中使用dataadaptor,并使用dataadaptor值填充数据集。将e.result设置为该值。

这不会真正解决您的问题,但您可能也希望设置sqlcommand的CommandType。