2012-04-06 11 views
0

私はいくつかのレコードを持つDataTableを持っています。これらのレコードをすべてリモートデータベースに挿入したいと思います。それを行う最も簡単な方法は何でしょうか?ほとんどの人がDataTableの行を繰り返し処理し、レコードをレコードごとに挿入することを読んでいます。私は、リモートサーバーへの接続を1つだけ行い、一括挿入を行いたいと思います。出来ますか?私はC#とMySQLを使用しています。DataTableからすべてのレコードをリモートデータベースに挿入する

+0

DataTableオブジェクトとリモートサーバーのテーブルの間に重複する行がありますか? – user957902

+0

[この質問に受け入れられる回答](http://stackoverflow.com/questions/5022531/best-way-to-bulk-insert-from-a-c-sharp-datatable)にチェックを入れたい場合があります。 –

答えて

1

私はこの答えは手遅れであるかどうか知りませんかあなたはこのような何かを行うことができます

:)ません:

// assume you have a table with one column; 
string commandText = "insert into t_test1 (myid) values (@tempid)"; 

using (MySqlConnection cn = new MySqlConnection(myConnectionString)) 
{ 
    cn.Open(); 

    using (MySqlCommand cmd = new MySqlCommand(commandText, cn)) 
    { 
     cmd.UpdatedRowSource = UpdateRowSource.None; 

     cmd.Parameters.Add("?tempid", MySqlDbType.UInt32).SourceColumn = "tempid"; 

     MySqlDataAdapter da = new MySqlDataAdapter(); 
     da.InsertCommand = cmd; 
     // assume DataTable dt contains one column with name "tempid" 
     int records = da.Update(dt); 
    } 

    cn.Close(); 
} 
2

ケマルTaskinの答えは、それがパフォーマンスに恐ろしいですエレガントなソリューションですが、大きなDataTableを使用します。
37500レコードのインサートで試したところ、15分以上かかりました。
一度に1つのレコードを挿入しているようです。
私は、1000レコードのMySQL挿入ステートメント文字列を生成し、そのデータが完成するまでループして、挿入時間を6秒に短縮したことがわかりました。 BULK LOADINGではなくCHUNK LOADINGです。誰かがより良い解決策を考え出すことができるなら、私に知らせてください。

public void writeToDBTable(DataTable dt)  
    { 

     MySqlConnection conn = new MySqlConnection(globalClass.connString); 
     conn.Open(); 
     String sql = null; 
     String sqlStart = "insert into MyTable (run_id, model_id, start_frame,water_year, state_id, obligateCover, DTWoodyCover, perennialGrowth, clonalCover) values "; 

     Console.WriteLine("Write to DB - Start. Records to insert = {0}", dt.Rows.Count); 
     int x = 0;    

     foreach (DataRow row in dt.Rows) 
     { 
      x += 1; 
       if (x == 1) 
       { 
        sql = String.Format(@"({0},{1},{2},{3},{4},{5},{6},{7},{8})", 
              row["runId"], 
              row["modelId"], 
              row["startFrame"], 
              row["waterYear"], 
              row["currentFrame"], 
              row["obligateCover"], 
              row["DTWoodyCover"], 
              row["perennialGrowth"], 
              row["clonalCover"] 
             ); 
       } 
       else 
       { 
        sql = String.Format(sql + @",({0},{1},{2},{3},{4},{5},{6},{7},{8})", 
              row["runId"], 
              row["modelId"], 
              row["startFrame"], 
              row["waterYear"], 
              row["currentFrame"], 
              row["obligateCover"], 
              row["DTWoodyCover"], 
              row["perennialGrowth"], 
              row["clonalCover"] 
             ); 

       } 

       if (x == 1000) 
       { 
        try 
        { 
         sql = sqlStart + sql; 
         MySqlCommand cmd = new MySqlCommand(sql, conn); 
         cmd.ExecuteNonQuery(); 
         Console.WriteLine("Write {0}", x); 
         x = 0; 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(sql); 
         Console.WriteLine(ex.ToString()); 
        } 
       } 

     } 
     // get any straglers 
     if (x > 0) 
     { 
      try 
      { 
       sql = sqlStart + sql; 
       MySqlCommand cmd = new MySqlCommand(sql, conn); 
       cmd.ExecuteNonQuery(); 
       Console.WriteLine("Write {0}", x); 
       x = 0; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(sql); 
       Console.WriteLine(ex.ToString()); 
      } 

     } 

     conn.Close(); 
     Console.WriteLine("Write to DB - End."); 
    } 
関連する問題