2017-04-21 17 views
0

最近、問題なしでバルクコピーを使用していましたが、これまでエンティティフレームワークの追加によってすべてのコードを変更するように更新されましたが、今は良い選択肢を見つけるための問題があります。Updatet Entity Frameworkを使用したバルク挿入代替?

データベースに多数のデータを挿入する必要があります。現在、データテーブルのすべてのデータを解析しています。その後、一括挿入を行います。 10個の列を持つ1つのテーブルに挿入する必要があり、挿入される行は1000から5000まで、おそらくそれ以上は7000までは変わらない可能性があります。そのテーブルMyTableで準備したテーブルは、そして、DBテーブル「MYDB_CONTENT」:

using (Oracle.DataAccess.Client.OracleBulkCopy bulkCopy = new Oracle.DataAccess.Client.OracleBulkCopy(dbConnectionString))      
        { 
         // The DBtable I'm loading the data to 
         bulkCopy.DestinationTableName = "MYDB_CONTENT";            
         bulkCopy.BatchSize = csvData.Rows.Count; 
         bulkCopy.BulkCopyTimeout = 30; 
         //Load the data to the database 
         bulkCopy.WriteToServer(MyTable); 

         // Close up   
         bulkCopy.Close(); 
         bulkCopy.Dispose(); 

         Console.WriteLine("Press Enter to finish."); 
         Console.ReadLine();        
        } 
        dbconn2.Close(); 

私が読んでいると私は古い本に関連した質問のいくつかを見たが、この時点で「一括」以外EF上で実装されていないようですいくつかのカスタムライブラリでは、これらのコードを他のコードで使用することが許可されているかどうかはわかりません。他のオプションは無料ではありません。また、Managed DataAccessバージョンでOracle.DataAccess.clietntを変更しようとしていますが、挿入数が多いため、これは良い考えではありません。私はEFでパフォーマンスを読んできました。大きな挿入にはあまり適していません。これはセグメント化された挿入の一部なので、このような4〜10個の挿入がシーケンシャルに加えられ、可能であれば、これはあまり高くありません...

いくつかのアドバイスは本当に感謝して、おそらくいくつかの簡単なコードは素晴らしいだろう!

ので、初心者が学び、私はしばらく前に似たような状況があった:)

+0

私は多分コード内の「バルク」の統合を修正することが可能であろう、数日後にもう一度だけ考えtakingthe問題ですが、これは問題を作るように見えますライブラリと一緒に。このエラーは、Oracleライブラリに互換性がないと示しています。どのようにこれを修正するための任意のアイデア?たぶんそれは簡単で、私はインサートに良いバルクファッションの方法を維持するだろう... – Juano

答えて

0

に行くことができ、あなたの助けと、このような場所をありがとう、私は数百万行が含まれている可能性がCSVファイルを解析しました。私は一度に約5000を読んだり解析したりしてデータベースに挿入し、次のバッチに移動しました。

当時私は別のORMを使用していましたが、原則は同じです。 EF6などのORMは、データベース呼び出しに多くのオーバーヘッドを追加します。何千ものレコードを挿入するのが本当に遅い理由で、関係や他の多くのことを追跡する必要があります。

私はあなたが現在インサートをしている方法が最も効率的な方法だと思います。スピードが必要な場合は、raw pure ADO.netがSQLサーバーに直接接続するようなものはありません。

本当に私を助けた特定のツールは、FastMemberは、優秀なマーク・グラヴェルによって書かれたstackoverflow!私はそれがオラクルをサポートしているかどうかは分かりませんが、一見する価値はあります。

編集:私はちょうど私がhttp://entityframework-extensions.net/

+0

多くの感謝フィル!問題は、DataAccess.Clientの使用は互換性がなく、Oracleライブラリのバージョンの問題が常に発生していることです。私はプロセスでクラッシュせずにこのコードを維持することができませんでした...私はライブラリを見ましたが、それは使用される支払が必要と思われる? – Juano

+0

私はどちらかともわからないが、サイトはあまり明確ではない。サイト所有者に連絡する価値がありますか? – Phil

+0

私はこのライブラリの所有者です。残念ながら、図書館は無料ではありません。新しいデザインですぐにウェブサイトを更新する必要があります。今度はその情報が明確になるようにします;) –

0

でデータベースにテストデータを追加する前に、使用しました。この便利な拡張機能について思い出しましたが、この時点では「バルク」はしていないようです一部のカスタムメイドライブラリを除きEF に実装されました

あなたは正しいです。カスタムライブラリのみがサポートしています。あなたはおそらく既に知っているよう

はいくつかのアドバイスが本当に

をいただければ幸いです、てOracleBulkCopyを管理DATAACCESSではサポートされていません。

OracleBulkCopyでの挿入には常にArrayBindingを使用する必要があります。両方のライブラリ(Oracle.DataAccessおよびOracle.ManagedDataAccess)で高速化され、サポートされることがよくあります。


免責事項:私はこのライブラリは、このライブラリを使用すると、倍数エンティティを保存できるようにすることで、あなたのコードをより効率的に行うことができます、NOT FREE

あるプロジェクトEntity Framework Extensions

の持ち主ですすぐに。すべての一括操作がサポートされています:

  • BulkUpdate
  • のbulkdelete
  • BulkMerge
  • 複数のデータベース・プロバイダは、Oracleを含むサポートされてい

    • BulkSaveChanges
    • BulkInsert。

      例:

      // Easy to use 
      context.BulkSaveChanges(); 
      
      // Easy to customize 
      context.BulkSaveChanges(bulk => bulk.BatchSize = 100); 
      
      // Perform Bulk Operations 
      context.BulkDelete(customers); 
      context.BulkInsert(customers); 
      context.BulkUpdate(customers); 
      
      // Customize Primary Key 
      context.BulkMerge(customers, operation => { 
          operation.ColumnPrimaryKeyExpression = 
           customer => customer.Code; 
      }); 
      
    関連する問題