17

私の現在のプロジェクトは、データ、ビジネス、プレゼンテーションの 3 つの標準レイヤーで構成されています。すべてのデータ アクセス ニーズにデータ エンティティを使用したいと考えています。アプリの機能の一部として、フラット ファイル内のすべてのデータをデータベースにコピーする必要があります。ファイルはそれほど大きくないので、SqlBulkCopy を使用できます。.NET での SqlBulkCopy クラスの使用法に関する記事をいくつか見つけました。ただし、すべての記事は DataTables を使用してデータを前後に移動しています。

SqlBulkCopy と共にデータ エンティティを使用する方法はありますか、それとも DataTables を使用する必要がありますか?

4

7 に答える 7

23

エンティティを IDataReader または DataTable に変換する必要があります。

以下を支援するために設計された小さなヘルパー クラスがあります

編集: msdn リンクが壊れています。代替コピーはここにあります: https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs

次に、次のように SqlBulkCopy を使用できます。

var sbCopy= new SqlBulkCopy(connectionString);
sbCopy.DestinationTableName = "TableName";
sbCopy.WriteToServer(entitiesList.AsDataReader()); 
于 2012-02-06T15:18:01.560 に答える
6

EF を使用して一括挿入するときにいくつかのアプローチを試してテストし、最終的には、さまざまな行サイズで最高のパフォーマンスを得るためにテーブル値パラメーターを使用しました。手元に数値はありませんが、bcp/BULK INSERT とテーブル値パラメーターのこのパフォーマンスが指針となる要因であることは知っています。

私たちは元々 、 を取り、を作成するSqlBulkCopyアダプターと組み合わせて使用​​していました。また、SqlBulkCopy に関連するメタデータも生成されました。ここでの利点は、インポートがコードのみであることです。@davehogan が投稿したコードは、これの基礎として使用されました。IEnumerable<T>IDataReader

テーブル値パラメーターには、データベースで定義されたストアド プロシージャとテーブル型が必要です。コード ファーストを使用している場合は、作成スクリプトの一部としてこれらを作成するために SQL を実行できます。これはより多くの作業ですが、データベースへの行の一貫性と高速スループットが大幅に向上することがわかりました。

また、メイン テーブルに一括挿入しないことを検討する価値があります。一時ヒープ テーブルを使用し、データのインポート後にクラスター化インデックスを追加します。MERGE次に、一時テーブルとメイン テーブルの間でa を実行します。これには、挿入中にメイン テーブルのインデックスがロックされないという利点があり、同時実行性が向上します。この方法を使用して挿入された CPU ごとに 2500 行/秒を超える傾向があります。

さらに情報が必要な場合はお知らせください。

于 2013-10-14T07:50:41.737 に答える
1

SqlBulkCopy は、WriteToServer メソッドを呼び出すときに IDataReader を使用するため、IEnumerable であるコレクションに基づいて IDataReader を実装できるはずです。これにより、エンティティ セットを取り込み、IDataReader 実装を使用して SqlBulkCopy を呼び出すことができます。

于 2010-04-12T20:00:23.947 に答える
1

データセットは、データ エンティティのシリアル化と見なすことができます。ただし、一般的に言えば、SqlBulkCopy はテーブルからテーブルへのものであると思います。したがって、データテーブルの理由です。

于 2010-03-31T14:06:32.807 に答える
1

SqlBulkCopy は、クライアントから SQL Server への行データの、ほぼバイト配列のような直接転送です。これは、SQL Server にデータを取り込む最も効率的な方法です。

ただし、そのパフォーマンスは真の「一括」操作にあります。数百または数千の行は、必ずしも使用を正当化するのに十分な数ではありません。数万行から数百万行の場合、SqlBulkCopy のパフォーマンスが真に輝きます。最後に、私たちが実際に話しているのは、サーバーにデータを取得することだけです。

行のセットを本番データベースのテーブルに入れるには、他にも重大な課題があります。インデックスの再作成、並べ替え (クラスター化されたインデックスがある場合)、外部キーの検証、これらすべての種類の操作により、挿入に時間がかかり、テーブルとインデックスのロックが発生する可能性があります。

また、TVP データは (一時テーブル データとして) ディスクに書き込まれ、アクセスしてテーブルに配置できます。SqlBulkCopy は、テーブルに直接アクセスできます...その場合のパフォーマンスは大幅に高速になりますが、並行性のために速度のバランスを取る必要があります。

全体的なルールは、処理する行が少数の場合は TVP を考え、何千もの行がある場合は、SqlBulkCopy を介してできるだけ早く SQL Server に取得することを検討することだと思います。

于 2016-09-26T19:11:05.723 に答える