2009-06-12 18 views
9

私は「C#で巨大なデータをDBに挿入するための控えめな方法」についていくつかの調査を行いましたが、多くの人がSqlBulkCopyを使用して私に提案しました。私はそれを試した後、それは本当に私を驚かせた。間違いなく、SqlBulkCopyは非常に高速です。 SqlBulkCopyはデータ(特に巨大なデータ)を挿入するのに最適な方法です。しかし、なぜ私たちはいつもそれを使用しません。 SqlBulkCopyを使用する場合の欠点はありますか?私は考えることができるSqlBulkCopyの欠点は何ですか

答えて

9

つの理由:私の知る限りでは

  1. が、それは、あなたがバルクinsert秒をしない、通常のワークロードの多くでは、マイクロソフトのSQL Serverの
  2. でのみ使用可能ですが、ときどきがselectsとupdatesと混在しています。マイクロソフト自身は、SqlBulkCopy MSDN pageでは、通常のinsertがそれより効率的だと述べています。

あなたはSqlBulkCopyは、通常の挿入と同等になりたい場合は、非常に少なくとも、あなたはそれをSqlBulkCopyOptions.CheckConstraintsパラメータを渡す必要がありますので注意してください。

+0

はい、SqlBulkCopyはMS SQL Serverでのみ使用できます。これは私が知っている欠点の1つに過ぎません。いつかそれは本当に大きな問題ではありません。たとえば、お客様はMS SQL Serverのみを使用し、System.Data.SqlClient名前空間に属するいくつかのクラスを使用してアプリケーションを構築します。 –

+0

デフォルトで 'SqlBulkCopyOptions.CheckConstraints'がfalseになるのはなぜですか? - それは直感に反している! –

+3

@BarryKaye:いいえ、そうではありません。名前は '一括コピー'なので、制約が既に正しいと分かっているデータをコピーする必要があります。そうでなければ、あなたが何をしているのか分かりません:) –

13

Oracle v11でもSqlBulkCopyは存在しますが、Oracle Clientのインストール時に取得するOracle .NETアセンブリによって提供されます。 SqlBulkCopyクラスは、基本的に、ターゲットデータベースエンジンのプロバイダによって1つずつ実装されます。

1つの大きな欠点ですが、エラー報告は絶対にありません。たとえば、DataSet内のデータを更新し、アダプタを使用してDBに戻し、キー違反(またはその他の障害)が発生した場合、致命的なDataRowsは.HasErrorsをtrueに設定します。それが発生したら例外メッセージに追加してください。

SqlBulkCopyを使用すると、エラーの種類が表示されます。それだけです。幸運をデバッグする。

+2

+1デバッグが完全に同意していますBulkCopyの問題私が持っている1つのアプローチは、失敗したBulkCopyコマンドを「分解」し、finallyブロックに行ごとに挿入することです。そうすれば、エラー報告の一環として問題のあるDataRowを特定できます。 – Totero

+1

私は、エラー報告のために、個々の失敗を取り戻す方法があるが、1レコードのページで一括コピーを再送信し、すべての例外を捕まえて(犯行行とともに)投げ込むことを理解した。それは最も効率的ではありませんが、エラーが発生した場合にのみ発生しますので、それほど悪くはありません。完全な記事はここを参照してください:http://www.codeproject.com/Articles/387465/Retrieving-failed-records-after-an-SqlBulkCopy-exc –

関連する問題