现在对数据库(以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批量插入更新数据

"C#":MySql批量数量导入的更多相关文章

  1. mysql批量数据导入探究

    最近工作碰到一个问题,如何将大量数据(100MB+)导入到远程的mysql server上. 尝试1: Statement执行executeBatch的方法.每次导入1000条记录.时间为12s/10 ...

  2. MySQL批量导入Excel数据

    MySQL批量导入Excel数据 1.确定需要导入数据的表名称以及字段,然后在新建的Excel表中,按照表字段正确排序:(注:(Excel文件的名称最好和数据库的名称一致,sheet表的名字最好和表名 ...

  3. MySQL批量导入Excel、txt数据

    MySQL批量导入Excel.txt数据 我想Excel是当今最大众化的批量数据管理软件了吧,所以我们会经常涉及到将Excel中数据导入到MySQL中的工作.网上有一些关于直接将Excel导入MySQ ...

  4. 文件批量加密重命名--python脚本AND mysql命令行导入数据库

    在考试中学生交上来的报告,需要进行一下文件名加密,这样阅卷老师就不知道是谁的报告了 在百度帮助下,完成了加密和解密脚本, 加密 #!/usr/bin/python # -*- coding: utf- ...

  5. 【转】MySQL批量SQL插入各种性能优化

    原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...

  6. 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)

    问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis lis ...

  7. 转载:【高并发简单解决方案 | 靠谱崔小拽 】redis队列缓存 + mysql 批量入库 + php离线整合

    需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框 ...

  8. 完美转换MySQL的字符集 Mysql 数据的导入导出,Mysql 4.1导入到4.0

    MySQL从4.1版本开始才提出字符集的概念,所以对于MySQL4.0及其以下的版本,他们的字符集都是Latin1的,所以有时候需要对mysql的字符集进行一下转换,MySQL版本的升级.降级,特别是 ...

  9. redis 队列缓存 + mysql 批量入库 + php 离线整合

    问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试. 解决: 问题一:要求日志最好入 ...

随机推荐

  1. Apache shiro集群实现 (八) web集群时session同步的3种方法

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  2. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  3. 20 ViewPager总结

    V4:兼容到1.6,V7:兼容到 2.1,V13:兼容到3.2(平板) 兼容包 ViewPager 父类: android.support.v4.view.ViewPager ViewPager:滑动 ...

  4. Dynamics CRM2016 New features in Microsoft Dynamics CRM Online 2015 Update 1 are now available

    很多人看过Dynamics CRM Online 2015 Update 1后,被它新的一个界面风格所吸引,还有它的很多新增功能,虽然官网放出了些补丁,但最重要的Server补丁一直没出,包括我在内很 ...

  5. GDAL库三个读取Jpeg2000格式驱动测试

    0.目的 GDAL库中提供了四五种读取Jpeg2000的驱动,但是各个驱动读取数据的效率各不相同,下面就针对三种读取jpeg2000的效率进行测试. GDAL库中提供的读取Jpeg2000的驱动有下面 ...

  6. Android异常:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original

    Android异常:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that cr ...

  7. Android之Gallery和Spinner-Android学习之旅(二十九)

    Spinner简介 spinner是竖直方向展开一个列表供选择.和gallery都是继承了AbsSpinner,AbsSpinner继承了AdapterView,因此AdaptyerView的属性都可 ...

  8. 使用js动态添加组件

    在文章开始之前,我想说两点 1 自己初学js,文章的内容在大神看来可能就是不值一提,但是谁都是从hello world来的,望高   手不吝指教# 2 我知道这个标题起的比较蛋疼,大家看图就能说明问题 ...

  9. Chapter 3 Protecting the Data(1):理解权限

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/39548665,专题目录:http://blog.csdn.net/dba_huangzj ...

  10. 从极大似然函数到EM算法

    最近看斯坦福大学的机器学习课程,空下来总结一下参数估计相关的算法知识. 一.极大似然估计: 大学概率论课程都有讲到参数估计的两种基本方法:极大似然估计.矩估计.两种方法都是利用样本信息尽量准确的去描述 ...