我在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。我做错了什么?
答案 0 :(得分:2)
您的连接变量不是线程安全的,因为两个线程都试图使用它。 ADO.NET将为您管理连接池,因此您应该在每个线程内部移动连接并使其成为原子
答案 1 :(得分:0)
这些命令是SELECTs(只读),INSERTs / UPDATEs / DELETE还是什么?您可能还希望在您的案例中使用dataadaptor,并使用dataadaptor值填充数据集。将e.result设置为该值。
这不会真正解决您的问题,但您可能也希望设置sqlcommand的CommandType。