2009-06-12 3 views
9

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

ответ

9

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

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

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

+0

Да, SqlBulkCopy может использоваться только с MS SQL Server. Это тоже один из недостатков, которые я знаю. Иногда это не так уж и важно. Например: наши клиенты используют только MS SQL Server, и мы создаем для них только приложения с несколькими классами, принадлежащими пространству имен System.Data.SqlClient. –

+0

Почему 'SqlBulkCopyOptions.CheckConstraints' false по умолчанию? - Это так контр-интуитивно! –

+3

@BarryKaye: Нет, это не так. Имя «Bulk Copy», поэтому вы должны копировать данные, для которых ограничения уже известны как правильные, если нет, то вы не знаете, что делаете ... :) –

13

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

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

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

+2

+1 Полностью согласен с тем, что отладка проблема с BulkCopy. Один из моих подходов - «деконструировать» неудачные команды BulkCopy и вставлять строки за строкой в ​​блок finally. Таким образом, я могу определить, что нарушающий DataRow является частью моей отчетности об ошибках. – Totero

+1

Я выяснил, что для сообщения об ошибках есть способ вернуть отдельные отказы, но он предполагает повторную отправку массовой копии на страницах одной записи, а затем ловить и выбросить все исключения (вместе с строками криминала). Это не самый эффективный, но это происходит только при возникновении ошибки, поэтому неплохо. См. Здесь полную статью: http://www.codeproject.com/Articles/387465/Retrieving-failed-records-after-an-SqlBulkCopy-exc –

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