2012-06-18 6 views
0

У меня есть приложение Windows Forms на C# /. NET4 с концом SQL 2008. Я открываю SqlConnection в моей кнопки мыши обработчик события, а затем вызвать несколько backgroundworkers каждый из которых вызывает метод CreateCommand соединения как внутри с помощью блока:Несколько вызовов CreateCommand на том же SqlConnection

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

Переменная соединения не является потокобезопасной, поскольку обе нити пытаются ее использовать. ADO.NET будет управлять пулом соединений для вас, поэтому вы должны переместить создание соединения внутри каждого потока и сделать его атомарным

+0

Ах, не понимал этого. Изменен мой шаблон, и он работает как шарм. Вы спасли мою ночь. –

+0

@AlineBernstein - отметьте его как ответ, тогда – fenix2222

0

Эти команды будут SELECT (только для чтения), INSERT/UPDATE/DELETE или что? Возможно, вы также захотите использовать dataadaptor в своем случае и заполнить набор данных значениями dataadaptor. Установите значение e.result для этого значения.

И это не решит вашу проблему, но вы, вероятно, захотите также установить CommandType для sqlcommand.

+0

они ВЫБОРЫ, и я использую заполнение dataadapter при возврате таблицы, execailscalar при возврате счета. –

Смежные вопросы