c#向Access数据库中批量插入大量记录的方法
来源:互联网 发布:景区网络销售专员 编辑:程序博客网 时间:2024/06/05 00:46
最近心情比较low,年纪大了,接触的开发工作越来越少,脑袋反应越来越慢,所以,开博客纪念吧
【背景】
最近有同事离职,我把他经手的项目接了过来,其中有一个功能,经过长时间运算以后,产生了17W条左右的记录,一次性保存到数据库中,每次界面要卡顿1分钟多,很是闹心,决定修改一下
【基本情况】
c#、nhibernate、Access数据库
【解决思路】
1、据说第一版本的实现,采用了nhibernate的save实体对象的方法,慢出翔了
2、然后作者改了第二版,思路是用OleDb,打开数据库链接以后,先生成17W+的sql的insert语句,然后循环遍历执行,向数据库中写入记录,依然慢的很,耗时1.5分钟左右
3、然后我改了第三版,思路依然是OleDb,然后是采用参数赋值的方法,构造OleDbParameter,然后循环修改参数,项数据库中写入记录,然后我就斯巴达了,没有性能提升!!!
我思考了一下,这种方式在Oracle中,应该是可以省略掉sql语言编译,可以加快一点速度,但是放到access中,没研究过,机制不懂啊
4、然后开始问百度
在某论坛找到思路:在Access中,弄个存储过程,然后按照OleDb调用存储过程的方式来进行批量插入,我试了一下,真心坑,效率更低了
5、然后只能问谷歌
找到下面这个链接,让我真的很欣慰(有兴趣的人可以看一下,作者尝试了很多种办法来提速,值得学习):
http://stackoverflow.com/questions/7070011/writing-large-number-of-records-bulk-insert-to-access-in-net-c
6、最后,编写自己的代码,结果是喜人的,5秒完成工作,提速10~15倍
命名空间:using DAO = Microsoft.Office.Interop.Access.Dao;
代码正文:
DAO.DBEngine dbEngine = new DAO.DBEngine(); DAO.Database db = dbEngine.OpenDatabase(databasePath); DAO.Recordset rs = db.OpenRecordset("Table"); DAO.Field[] myFields = new DAO.Field[9]; myFields[0] = rs.Fields["F_TYPE"]; myFields[1] = rs.Fields["F_TAG"]; myFields[2] = rs.Fields["F_RULEID"]; myFields[3] = rs.Fields["F_SOURCEID"]; myFields[4] = rs.Fields["F_TAGID"]; myFields[5] = rs.Fields["F_DESCRIPTION"]; myFields[6] = rs.Fields["F_TASKID"]; myFields[7] = rs.Fields["F_RULEGROUP"]; myFields[8] = rs.Fields["F_RULENAME"]; int strTagKey = -1; for (int i = 0; i < sList.Count; i++) { int key; if (int.TryParse(sList[i].TagKey, out key)) strTagKey = string.IsNullOrEmpty(sList[i].TagKey) ? -1 : int.Parse(sList[i].TagKey); rs.AddNew(); myFields[0].Value = sList[i].RuleGroup; myFields[1].Value = sList[i].Tag; myFields[2].Value = sList[i].CheckRule.Key; myFields[3].Value = strTagKey; myFields[4].Value = strTagKey; myFields[5].Value = sList[i].Description; myFields[6].Value = nTaskID; myFields[7].Value = sList[i].RuleGroup; myFields[8].Value = sList[i].RuleName; rs.Update(); } rs.Close(); db.Close(); return true;
7、上面代码的解释
其实没什么好解释的,sList里面放了17W+的对象,一个一个插入即可
Microsoft.Office.Interop.Access.Dao直接在VS中添加引用即可
- c#向Access数据库中批量插入大量记录的方法
- ACCESS批量插入记录终极方法
- 向db2中插入大量数据处理方法
- C#向ACCESS数据库插入图片
- C#向ACCESS数据库插入空值
- C#向ACCESS数据库插入空值
- c#中向listbox添加大量元素的快速方法
- 数据库中批量插入数据的方法
- 向数据库中批量插入数据
- 用一条SQL语句实现向数据库中插入多条记录的方法
- 用一条SQL语句实现向数据库中插入多条记录的方法
- 一次向数据库中插入多条相同记录的SQL方法(只有一个列不同)
- C#向SQL Server中插入记录时的问题
- C# 向数据库插入一条记录后,获得新插入记录的自动编号(id)
- 如何向数据库中插入包含单引号的记录
- C#连接mysql数据库 及向表中插入数据的方法
- C#关于向数据库中插入数据时,有不规则自增列的处理方法
- C#连接mysql数据库 及向表中插入数据的方法
- 测试看看博客样式
- 字符串查找算法:bm算法
- 杂记,本人用的~方便查询~~省的满世界找
- tomcat部署web应用(转)
- UVa - 100 - The 3n + 1 problem
- c#向Access数据库中批量插入大量记录的方法
- Spring+ActiveMQ实现消息的交换
- LeetCode-House Robber-解题报告
- Ubantu开发环境安装部署
- 【LeetCode】1 Two Sum
- 各语言中取整的运用
- git
- ListView中使用单例添加按钮事件监听
- 【原创】win7同局域网下共享文件