zoukankan      html  css  js  c++  java
  • "C#":MySql批量数量导入

      现在对数据库(以MySql为例)的操作大多会封装成一个类,如下例所示:

     1 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://www.connectionstrings.com/
    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批量插入更新数据

  • 相关阅读:
    之所以菜鸟依旧
    单点登陆
    让entityframework.extend库同时支持mysql,sqlsever
    背包算法
    JS中实现继承
    Altium Designer 生成 Mach3 G代码的程序
    test博客嵌入pbi
    testPBI报表
    html中隐藏title属性方法
    Spring mvc 中有关 Shiro 1.2.3 配置问题
  • 原文地址:https://www.cnblogs.com/xiehongfeng100/p/4503830.html
Copyright © 2011-2022 走看看