2010-01-14 3 views
1

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

Это происходит при команде 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(); 
} 
+0

Вы можете избавиться от 's.Close()' вообще. См. Комментарий, который я оставил на ответе @ Yooder. –

ответ

1

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

+0

Кроме того, нет необходимости явно закрывать его. Вызов 's.Close()' может быть полностью удален, поскольку SqlBulkCopy реализует 'IDisposable', поэтому существующий блок' using' закроется и удалит его. –

+1

Я бы оставил его, явное закрытие было избыточным - но хорошо иметь на всякий случай, что блок 'using' каким-то образом уходит. Лично мое предпочтение заключается в том, чтобы оставить небольшие оптимизации до компилятора (это довольно spanky на них) и держать код максимально читабельным и понятным – STW

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