2012-04-06 78 views
0

我有一个DataTable与几个记录。我想将所有这些记录插入远程数据库。最简单的方法是什么?我读过大多数人遍历DataTable的行并按记录插入记录。我想只连接1个远程服务器并进行批量插入。可能吗?我正在使用C#和MySQL。从DataTable插入到远程数据库的所有记录

+0

DataTable对象和远程服务器上的表之间是否存在重复行? – user957902 2012-04-06 21:07:33

+0

你可能想检查[接受的回答这个问题](http://stackoverflow.com/questions/5022531/best-way-to-bulk-insert-from-a-c-sharp-datatable) – 2012-04-06 21:40:09

回答

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分钟。
它似乎一次插入一条记录。
我发现如果我生成一个包含1000条记录的MySQL插入语句字符串并循环数据直到完成,我的插入时间减少到6秒。它不是庞大的装载,它的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."); 
    } 
相关问题