2017-09-29 27 views
0

私は検索してきましたが、達成するための良い例は見つかりませんでした。タイトルはそれをすべて言います。これは私がこれまで持っているものです。C#を使用してDataTableからOracleにバルク挿入

  //gather the report details 
      DataTable dtReturn = new DataTable(); 
      DataTable dtResults = new DataTable(); 
      string strScript = ""; 
      bool doReturnData = false; 

      try 
      { 
//this function returns my SQL table in to a datatable dtReturn: 
       var ii = 
        Utility.db.Connection.EstablishDBConnection("usp_get_data_recap", dtReturn, null, null, true, 60); 

//Clear out table before insert 
       dtResults = OracleDataPull(9, "TRUNCATE TABLE user.SIGNUP_1"); 

       OracleParameter myparam = new OracleParameter(); 
       OracleCommand mycommand = new OracleCommand(); 
       int n; 

//bulk insert to the signup_1 table from the datatable members. Datatable contains the same 4 fields being inserted in to signup_1 on the oracle side: 
       mycommand.CommandText = "INSERT INTO user.SIGNUP_1 ([ID], [ACCOUNT_NUMBER], [MAIN_CUSTOMER], [SIGNUP_DATE]) VALUES(?)"; 
       mycommand.Parameters.Add(myparam); 

       for (n = 0; n < 100000; n++) 
       { 
        [what do i do here?] 
       } 
      } 

私はこれが正しいかどうかを確認していない、あるいはもっと簡単な方法があれば、私はIDにdtReturn.Rows [n]は[0-3]をマップする必要があります、account_number、main_customer、およびsignup_dateをそれぞれ指定します。

非常に感謝しています!前もって感謝します!

編集:

私は以下の提案を試みたが、ラムダ式を使用してエラーを取得しています: は、「それはデリゲート型ではありませんので、 『文字列』を入力するラムダ式を変換できません」:

var ii = 
    Utility.db.Connection.EstablishDBConnection("usp_get_data", dtReturn, null, null, true, 60); 

dtResults = OracleDataPull(9, "TRUNCATE TABLE user.PR_data"); 

OracleParameter myparam = new OracleParameter(); 
OracleCommand mycommand = new OracleCommand(); 

mycommand.ArrayBindCount = dtReturn.Rows.Count; 
mycommand.Parameters.Add(":myparam", OracleDbType.Varchar2, dtReturn.Select(c => c.myparam).ToArray(), ParameterDirection.Input); 
mycommand.ExecuteNonQuery(); 

int n; 

mycommand.CommandText = "INSERT INTO user.PR_data ([ID], [ACCOUNT_NUMBER], [MAIN_CUSTOMER], [SIGNUP_DATE]) VALUES(?)"; 
mycommand.Parameters.Add(myparam); 

for (n = 0; n < 100000; n++) 
{ 
    myparam.Value = n + 1; 
    mycommand.ExecuteNonQuery(); 
} 

dtResults = Utility.db.Connection.oracletoDataTable(strScript, doReturnData); 

これは、正しい結果が得られるように設定されているかどうかもわかりません。私はどこに間違っているのかアドバイスできますか?

+0

ところで、挿入したいフィールド?それはあなたのデータテーブルにありますか? –

+0

この投稿をご覧ください:https://stackoverflow.com/questions/343299/bulk-insert-to-oracle-using-net/797636#797636提示された問題は、あなたがマイナーな違いを持っ​​ているものに似ています。 –

+0

私が挿入したいフィールドは、上記の私の投稿に示したもので、私の投稿に示したOracleテーブルに移動する必要があります。そして、はい、私はそのポストを見ました。それは私が上にある私の論理を引っ張ったところで、残念ながらそれが必要な場所ではありません。 Oracleへの一括挿入用のデータテーブル(上記のレイアウト)をトラバースできる必要があります。ありがとう! –

答えて

0

私は実際にcodeproject.comのおかげでこのソリューションにもっと効率的なアプローチを見つけました。

これは素晴らしい仕組みです。私がすべては私にschema.tableとデータテーブルとそれを呼んで、それは残りの部分を処理します。

public static void WriteToServer(string qualifiedTableName, DataTable dataTable) 
      { 
       //************************************************************************************************************************** 
       // Summary: Hit the Oracle DB with the provided datatable. bulk insert data to table. 
       //************************************************************************************************************************** 
       // History: 
       // 10/03/2017     Created 
       //************************************************************************************************************************** 

       try 
       { 
        OracleConnection oracleConnection = new OracleConnection(Variables.strOracleCS); 

        oracleConnection.Open(); 
        using (OracleBulkCopy bulkCopy = new OracleBulkCopy(oracleConnection)) 
        { 
         bulkCopy.DestinationTableName = qualifiedTableName; 
         bulkCopy.WriteToServer(dataTable); 
        } 
        oracleConnection.Close(); 
        oracleConnection.Dispose(); 
       } 
       catch (Exception ex) 
       { 
        Utility.db.Log.Write(Utility.db.Log.Level.Error, "Utility", "db:WriteToServer: " + ex.Message); 
        throw; 
       } 
      } 

REF:https://www.codeproject.com/Questions/228101/oracle-data-bulk-insert

0
mycommand.ArrayBindCount = dtResults.Count; 
mycommand.Parameters.Add(":parameterName", OracleDbType.Varchar2, dtResults.Select(c => c.ParameterName).ToArray(), ParameterDirection.Input); 
mycommand.ExecuteNonQuery() ; 

上記のコードを使用することができます。

+0

これは機能しませんでした。エラーが発生しています。上記の私の編集をご覧ください。 –

関連する問題