WriteToServer: свойство соединения не было инициализировано. ошибка sqlbulkcopy

запускаю sqlbulkcopy в С# и получаю сообщение об ошибке: WriteToServer: свойство Connection не было инициализировано.

это происходит при команде WriteToServer. Соединение открыто.

using (SqlBulkCopy s = new SqlBulkCopy(conn))
{
  foreach (DataTable dt in ds.Tables)
  {

    s.DestinationTableName = "tmp_" + dt.TableName;
    s.NotifyAfter = 5000;
    s.SqlRowsCopied += new SqlRowsCopiedEventHandler(s_SqlRowsCopied);
    s.WriteToServer(dt);
    s.Close();
  }
}

Правильный код:

using (SqlBulkCopy s = new SqlBulkCopy(conn))
{
  foreach (DataTable dt in ds.Tables)
  {
    s.DestinationTableName = "tmp_" + dt.TableName;
    s.NotifyAfter = 5000;
    s.SqlRowsCopied += new SqlRowsCopiedEventHandler(s_SqlRowsCopied);
    s.WriteToServer(dt);
  }
  s.Close();
}

person Chris Hayes    schedule 14.01.2010    source источник
comment
Вы можете полностью избавиться от s.Close(). См. комментарий, который я оставил к ответу @Yooder.   -  person Ahmad Mageed    schedule 14.01.2010


Ответы (1)


На первый взгляд я бы предположил, что первый проход через цикл foreach выполняется правильно, затем s.Close(); очищает экземпляр SqlBulkCopy и очищает его свойство Connection, таким образом создавая исключение на втором проходе.

person STW    schedule 14.01.2010
comment
Кроме того, нет необходимости явно закрывать его. Вызов s.Close() можно полностью удалить, поскольку SqlBulkCopy реализует IDisposable, поэтому существующий блок using закроется и избавится от него. - person Ahmad Mageed; 14.01.2010
comment
Я бы оставил его, явное закрытие избыточно, но хорошо иметь его на случай, если блок using каким-то образом исчезнет. Лично я предпочитаю оставить небольшие оптимизации на усмотрение компилятора (в этом он довольно хлипкий) и сделать код как можно более читабельным и понятным. - person STW; 14.01.2010