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批量数量导入的详细内容...