c#向Access数据库中批量插入大量记录的方法

最近心情比较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中添加引用即可


  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
要使用C#创建Access数据库,你需要遵循以下步骤: 1. 首先,确保你的计算机安装了Microsoft Access数据库软件。如果没有安装,你需要先下载并安装它。 2. 在C#,你需要使用 `System.Data.OleDb` 命名空间来与Access数据库进行交互。因此,确保在代码文件的开头添加以下引用: ```csharp using System.Data.OleDb; ``` 3. 接下来,你可以通过使用 `OleDbConnection` 类来创建与Access数据库的连接。在连接字符串指定数据库的路径和名称。 ```csharp string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\路径\数据库名称.mdb"; OleDbConnection connection = new OleDbConnection(connectionString); ``` 请注意,这里的连接字符串的 `Provider` 属性用于指定Access数据库版本。根据你所使用的版本,可能需要不同的提供程序。 4. 现在,你可以打开数据库连接,并执行创建数据库的操作。 ```csharp connection.Open(); // 创建数据库的SQL查询语句 string createDatabaseQuery = "CREATE DATABASE YourDatabaseName"; OleDbCommand command = new OleDbCommand(createDatabaseQuery, connection); command.ExecuteNonQuery(); connection.Close(); ``` 以上代码段的 `YourDatabaseName` 是你想要为数据库指定的名称。 请注意,以上代码只是创建数据库的示例。你还可以执行其他SQL查询语句以创建表格、插入数据等操作。 这是一个基本的创建Access数据库的示例。你可以根据你的需求进行适当的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值