В чем недостаток SqlBulkCopy - PullRequest
9 голосов
/ 12 июня 2009

Я провел некоторое исследование для «Лучшего способа вставить огромные данные в БД с помощью C #», тогда многие люди просто предложили мне использовать SqlBulkCopy. После того, как я попробовал это, и это действительно поразило меня. Несомненно, SqlBulkCopy очень и очень быстрый. Кажется, что SqlBulkCopy - это идеальный способ вставки данных (особенно огромных данных). Но почему бы нам не использовать его всегда. Есть ли какой-либо недостаток в использовании SqlBulkCopy?

Ответы [ 2 ]

13 голосов
/ 27 июля 2010

SqlBulkCopy существует и для Oracle v11, но она предоставляется сборками Oracle .NET, которые вы получаете при установке Oracle Client. Класс SqlBulkCopy в основном реализуется один за другим поставщиком целевого механизма базы данных.

Один ОГРОМНЫЙ недостаток - сообщения об ошибках абсолютно отсутствуют. Если, например, вы обновили данные в DataSet, сбросили их обратно в БД с помощью адаптера и произошло нарушение ключа (или любая другая ошибка), виновнику DataRows будет присвоено значение .HasErrors, равное true, и вы можете добавьте это к своему сообщению об исключении, когда оно поднято.

С помощью SqlBulkCopy вы просто получаете тип ошибки и все. Удачи в его отладке.

9 голосов
/ 12 июня 2009

Две причины, по которым я могу придумать:

  1. Насколько я знаю, он доступен только для Microsoft SQL Server
  2. Во многих обычных рабочих нагрузках вы не выполняете массовую insert с, а иногда insert с, смешанную с select с и update с. Сами Microsoft заявляют, что обычный insert более эффективен для этого на странице SqlBulkCopy MSDN .

Обратите внимание, что если вы хотите, чтобы SqlBulkCopy был эквивалентен обычной вставке, по крайней мере вам придется передать ему параметр SqlBulkCopyOptions.CheckConstraints.

...