好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

"C#":MySql批量数量导入

namespace TESTDATABASE 2 { 3 public enum DBStatusCode { ALL_OK, MySqlExcuteErr } 4 public class TestDB 5 { 6 private string hostIp; 7 private string dbName; 8 private string dbUser; 9 private string dbPasswd; 10 private MySqlConnection dbConn; 11 12 public TestDB() 13 { 14 this .initConn(); 15 } 16 ~ TestDB() 17 { 18 dbConn.Dispose(); 19 } 20 void initConn() 21 { 22 dbName = " testDB " ; 23 hostIp = " 127.0.0.1 " ; 24 dbUser = " root " ; 25 dbPasswd = " root " ; 26 string connString; // Connection string。数据库连接字符串大全:http://HdhCmsTestconnectionstrings测试数据/ 27 connString = " SERVER= " + hostIp + " ; " + " DATABASE= " + 28 dbName + " ; " + " UID= " + dbUser + " ; " + " PASSWORD= " + dbPasswd + " ; " ; 29 dbConn = new MySqlConnection(connString); 30 } 31 // Open connection 32 public void openConn() 33 { 34 if (dbConn.State == ConnectionState.Closed) 35 dbConn.Open(); 36 } 37 // Close connection 38 public void closeConn() 39 { 40 if (dbConn.State == ConnectionState.Open) 41 dbConn.Dispose(); 42 } 43 // Insert 44 public DBStatusCode insertTest(ItermList itemList) 45 { 46 DBStatusCode flag = DBStatusCode.ALL_OK; 47 openConn(); 48 string cmdText = " insert into testTable (c1, c2, c3, c4) " 49 + " VALUES (@c1, @c2, @c3, @c4) " ; 50 MySqlCommand cmd = new MySqlCommand(cmdText, dbConn); 51 try 52 { 53 foreach (Item item in itemList) 54 { 55 cmd.Parameters.Clear(); // it is needed 56 cmd.Parameters.AddWithValue("@c1", item.c1); 57 cmd.Parameters.AddWithValue("@c2", item.c2); 58 cmd.Parameters.AddWithValue("@c3", item.c3); 59 cmd.Parameters.AddWithValue("@c4", item.c4); 60 cmd.ExecuteNonQuery(); 61 } 62 } 63 catch (Exception ex) 64 { 65 flag = DBStatusCode.MySqlExcuteErr; 66 } 67 finally 68 { 69 cmd.Dispose(); 70 } 71 closeConn(); 72 return flag; 73 } 74 } 75 }

   上边例子涉及到对MySql数据库的数据导入。可以看出(56~60),每循环一次,就会对数据库插入一次。当数据量比较小时,可能还看不出软件的卡顿现象;当数据量很大时,整个软件可能就会卡住几分钟了。所以,我们最好是当所有数据都准备好时,再一次性向数据库定入,以减少插入次数,以最终减少数据导入时间。而且,我们还想,在数据库插入失败的情况下还能够回滚。下边是改进的函数:

  1       //   Insert 
  2       public   DBStatusCode insertTest(ItermList itemList)
   3           {
   4              DBStatusCode flag =  DBStatusCode.ALL_OK;
   5               openConn();
   6               string  cmdText =  "  insert into testTable (c1, c2, c3, c4)  " 
  7                              +  "  VALUES (@c1, @c2, @c3, @c4)  "  ;
   8              MySqlCommand cmd =  new   MySqlCommand(cmdText, dbConn);
   9               MySqlTransaction tx = this.dbConn.BeginTransaction();
  10               cmd.Transaction = tx;
  11               try 
 12               {
  13                   foreach  (Item item  in   itemList)
  14                   {
  15                      cmd.Parameters.Clear();  //   it is needed 
 16                      cmd.Parameters.AddWithValue( "  @c1  "  , item.c1);
  17                      cmd.Parameters.AddWithValue( "  @c2  "  , item.c2);
  18                      cmd.Parameters.AddWithValue( "  @c3  "  , item.c3);
  19                      cmd.Parameters.AddWithValue( "  @c4  "  , item.c4);
  20                       cmd.ExecuteNonQuery();
  21                   }
  22                   tx.Commit();
  23               }
  24               catch   (Exception ex)
  25               {
  26                  flag =  DBStatusCode.MySqlExcuteErr;
  27                   tx.Rollback();
  28               }
  29               finally 
 30               {
  31                   cmd.Dispose();
  32               }
  33               closeConn();
  34               return   flag;
  35          }

 

   这里的改进可以说还只是初步的。当数据特别大时,这种方法就会出问题了。因为计算机要一次性把非常多的数据插入到数据库,有可能因为内存不足等原因而导致最终导入时间过长等。所以,在有一些情况下,我们还得 分批提交 ( tx.Commit() ),例如每1000个数据提交一次,这样就能够大大减轻计算机和数据库负担了。

  关于MySql事务介绍资料:

  MySQL 事务

  说说MySQL中的事务

 

  关于批量插入数据,可参考的资源还有:

  MySQL大量数据插入各种方法性能分析与比较

  在C#中完成海量数据的批量插入和更新

  [C#][SQL SERVER] 提高 Insert 效能

  .NET 批量插入数据,DataSet, SqlDataAdapter.Update

  datatable 使用SqlDataAdapter.Update批量插入更新数据

 

"C#":MySql批量数量导入

标签:

查看更多关于"C#":MySql批量数量导入的详细内容...

  阅读:25次