2016-04-05 18 views
0

私が理解していることから、C#とSQL Serverを使用して一括データを挿入する最も良い方法は、テーブルタイプを使用してデータテーブルを渡すことです。 現在のプロセスフローは、有効なレコードを正常に処理してエラーを報告できるように、一度に1レコードずつデータを処理/挿入することです(何千ものレコードがあっても)。明らかにこれは大きなパフォーマンス上の問題です。バルク挿入操作でエラーなしのレコードを処理する

有効なレコードが挿入され、無効なレコードが失敗する一括挿入操作を行う方法はありますか? もしそうなら、どのレコードが受け渡され、どのレコードが失敗したのか、またはエラーが発生したのかをどうやって知ることができますか?

+1

この[記事](http://www.codeproject.com/Articles/387465/Retrieving-failed-records-after-an-SqlBulkCopy-exc)ではこれについて詳しく説明しています。 –

+0

これは本当に興味深い記事ですが、これはどこでこれを行うべきかについて私にいくつかの追加のアイデアを与えるでしょうが、2012年に書かれました。それ以来、新しいバージョンのSQL Serverまたは.Net Framework 。バルクコピーは、テーブルタイプを使用しているかどうかを判断する最も良い方法ですか? –

答えて

0

SSISだけがあなたのことをできると思う。過去に私が行ったことは、SQLXMLを使用してSQL Serverにデータを一括ロードすることです(https://msdn.microsoft.com/en-us/library/ms171993.aspx)。

は基本的に私がやったこと、このされています

  1. テーブル構造に対応するXMLスキーマを作成し、マッピングの属性を追加した(ここではhttps://msdn.microsoft.com/en-us/library/ms171721.aspxを参照)
  2. はのためのXMLスキーマを使ってC#からのXMLファイルを作成します私のデータのシリアル化
  3. BulkInsertのような最初のエラーでXMLの一括読み込みが失敗したので、XMLReaderを使用してXML文書を解析し、大きなXMLファイルをサポートしていなければなりませんでした。このようにして、どの要素がスキーマに準拠していないかを知っていたので、それらを削除して別のXMLファイルに格納することができました。
  4. バルクだからここでの主なI/Oが含まれ

SQL Serverテーブルに固定されたXMLファイルを読み込む:XMLを読むために読者のストリームを有し、かつ2作家は、有効と無効なXMLファイルを書き込むためにストリームと最後に有効なXMLファイルをバルクロードします。

パフォーマンスは素晴らしいです(私のラップトップでは5分未満で1GBファイルをバルクロードできますが、これはディスクの速度とCPUによって異なる場合があります)。メモリ使用率は非常に低いbtwです。

関連する問題