技术图文:如何利用 C# 向 Access 数据库插入大量数据?
背景
通常我们在做数据分析与处理之前,需要把从网站爬取的数据或者从 甲方 系统中导出的数据存入到自己的数据库中。如果数据量小,直接利用 SQL的 Insert 语句逐条插入就好。可是数据量上万条之后,再利用这样的方法就会奇慢无比,让人无法忍受。
最近在优化 台区线损排查分析软件 时遇到从集中器采集的上万条语句的入库,以及 继电保护可靠性评估与检修决策软件 中导入几万条 变电站一次设备的保护告警数据,都需要等待很长时间的问题。虽然解决问题时,是难过的,但搞定之后还是非常的开心。很享受这样的心流体验。
现在,我把解决的方法记录下来,以方便大家在遇到此类问题时作为参考。
技术分析
最开始,使用 OleDb,打开数据库链接以后,先生成几万条 SQL 的insert
语句,然后循环遍历执行,向数据库中写入记录,慢的出翔了。
不能忍,尝试改进一个版本。
仍然使用 OleDb,采用参数赋值的方法,构造 OleDbParameter,然后循环修改参数,向数据库中写入记录,结果没有性能提升。
不能忍,继续尝试其它的方法。
这次使用 Transaction,通过事务的方式向数据库中写入记录,由于事务将大量的 SQL 语句一次提交处理,所以速度有所提升,但仍然慢的要死。
不能忍,继续尝试改进,要哭死的感觉。
查了很多资料,这次使用 OleDbDataAdapter,利用这个桥接器将插入的数据更改(Update)回数据源,可依然慢的要死。
没有办法,问题需要解决,继续寻找解决方案。
受到这个帖子的启发,这次使用 DAO 的方式。
https://stackoverflow.com/questions/7070011/writing-large-number-of-records-bulk-insert-to-access-in-net-c
结果喜人,把以前5分钟左右的插入问题,3秒钟之内完成,提升10多倍。
代码实现
1.利用 OleDbDataAdapter 方式。
public void InsertRow(DataTable dataTable)
{if (IsConnected == false)throw new Exception("没有与数据库进行连接.");if (dataTable == null)throw new ArgumentNullException();if (string.IsNullOrEmpty(dataTable.TableName))throw new Exception("DataTable 的 TableName属性需要赋值。");List<string> columnList = new List<string>();foreach (DataColumn one in dataTable.Columns){columnList.Add(one.ColumnName);}string tableName = dataTable.TableName;OleDbDataAdapter adapter = new OleDbDataAdapter();adapter.SelectCommand = new OleDbCommand("select * from " + tableName, _pOleDbConnection);using (OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter)){adapter.InsertCommand = builder.GetInsertCommand();foreach (string one in columnList){adapter.InsertCommand.Parameters.Add(one, dataTable.Columns[one].DataType);}adapter.Update(dataTable);}
}
2. 利用 DAO 方式。
using Microsoft.Office.Interop.Access.Dao;public override void InsertRow(DataTable dataTable)
{if (dataTable == null)throw new ArgumentNullException();if (string.IsNullOrEmpty(dataTable.TableName))throw new Exception("DataTable 的 TableName属性需要赋值。");List<string> columnList = new List<string>();foreach (DataColumn one in dataTable.Columns){columnList.Add(one.ColumnName);}string fileName = _pConnectionProperty.ParentDirectory + "\\" + _pConnectionProperty.Name;DBEngine dbEngine = new DBEngineClass();Database db = dbEngine.OpenDatabase(fileName);Recordset rs = db.OpenRecordset(dataTable.TableName);Field[] myFields = new Field[columnList.Count];for (int i = 0, len = myFields.Length; i < len; i++){myFields[i] = rs.Fields[columnList[i]];}for (int i = 0, len = dataTable.Rows.Count; i < len; i++){rs.AddNew();for (int j = 0;j < myFields.Length; j++){myFields[j].Value = dataTable.Rows[i][j];}rs.Update();}rs.Close();db.Close();
}
3. 实验结果。
从Excel中导入的告警数据:
总结
到此为止,利用 C# 向 Access 数据库插入大量数据的方法就介绍完了。希望对大家有用。其实,我们学技能就应该以问题为导向,这些东西在数据库原理的书中是不会涉及的,只有不断的去搜索,去尝试才能把知识内化,为自己所用!好了,就到这里吧!See You!
相关图文:
- 如何利用 C# 实现 K 最邻近算法?
- 如何利用 C# 实现 K-D Tree 结构?
- 如何利用 C# + KDTree 实现 K 最邻近算法?
- 如何利用 C# 对神经网络模型进行抽象?
- 如何利用 C# 实现神经网络的感知器模型?
- 如何利用 C# 实现 Delta 学习规则?
- 如何利用 C# 开发「桌面版百度翻译」软件!
- 如何利用 C# 开发「股票数据分析软件」(上)
- 如何利用 C# 开发「股票数据分析软件」(中)
- 如何利用 C# 开发「股票数据分析软件」(下)
- 如何利用 C# 爬取「财报说」中的股票数据?
- 如何利用 C# 爬取 One 持有者返利数据!
- 如何利用 C# 爬取Gate.io交易所的公告!
- 如何利用 C# 爬取BigOne交易所的公告!
- 如何利用 C# 爬取 ONE 的交易数据?
- 如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!
- 如何利用 C# 爬取「当当 - 计算机与互联网图书销量榜」!
- 如何利用 C# 爬取「互动出版网 - 计算机图书销量榜」!
- 如何利用 C# 爬取「中国图书网 - 计算机与互联网图书销量榜」!
- 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!
- 如何利用 C# 爬取「猫眼电影专业版:票房」数据!
- 如何利用 C# 爬取「猫眼电影:最受期待榜」及对应影片信息!
- 如何利用 C# 爬取「猫眼电影:国内票房榜」及对应影片信息!
- 如何利用 C# + Python 破解猫眼电影的反爬虫机制?
- 如何利用 C# 爬取带 Token 验证的网站数据?
相关文章:

Web前端面试自我介绍对话技巧注意事项
大家在学会了web前端技术后,当然是要准备找一个适合自己的web前端工作了,那么面试环节是必不可少的,有一个良好的自我介绍表述,在HR心中也能加分不少,接下来小编就为大家介绍一下Web前端面试自我介绍对话技巧注意事项。…

Android使用ListView控件问题
Android使用ListView控件问题: The application has stopped unexpectedly, please try again。 开发环境:android 1.6 最低兼容 4.0 报错代码如下: main.xml 代码 1 <?xml version"1.0" encoding"utf-8"?>2 <…

技术图文:如何实现 DataTable 与模型类 List 的相互转换?
通常情况下,我们在做工程项目的时候,需要把待处理的数据存储在数据库中。 通过 SQL 的 Select 语句很容易把查询的结果以 DataTable 的方式得到,但在对 DateTable 中的数据进行进一步的检索时远远没有模型类 List<T> 方便。 所以&…

SQL server 基本语句
SQL server数据库基本语句一、实验要求:1、 查询student表中所有学生的信息select * from student如图所示2、查询student表中“姓名”“所在班级”和“成绩”列内容select 姓名,所在班级,成绩 from student如图所示3、查询student表…

Python中if条件判断语句怎么用?
俗话说“不积跬步无以至千里”。学习了Python的基本语法后,接下来我们学习Python常的if条件判断语句。 if语句是最简单的条件判断语句,它可以控制程序的执行流程,其使用格式如下: if判断条件: 满足条件时要做的事情1… 满足条件时要做的事情2…

Arcmap技巧总结
Arcmap技巧总结 1. 要素的剪切与延伸 实用工具 TASK 任务栏 Extend/Trim feature 剪切所得内容与你画线的方向有关。 2. 自动捕捉跟踪工具 点击Editor工具栏中Snapping来打开Snapping Environment对话框 捕捉设置中有3个选项, vertex edge end 分…
Spring Web MVC(一)
概述Spring Web MVC框架的特点五大核心组件编程步骤 五大核心组件DispatcherServlet前端控制器WebApplicationContext中特殊的bean处理过程 HandlerMapping 处理映射Spring中最常用的两个处理器映射BeanNameUrlHandlerMappingSimpleUrlHandlerMapping拦截器HandlerInterceptor概…

技术图文:如何利用BigOne的API制作自动化交易系统 -- 身份验证
背景 最近,自己在技术精进方向上有所犹豫,是往"网络渗透"的方向走呢?还是往"量化交易"的方向走? 如果选择精进“网络渗透”,就需要学习各种Web渗透技术、客户端渗透技术、移动环境渗透技术、社会…

零基础学习java软件开发攻略
Java是主流开发语言,应用普遍。Spring Boot是Java开发时常用框架,有非常丰富的组件和易用的功能。实际开发工作中涉及到的知识点比较多,将它们分门别类,专题攻关,由点到面,学习效率非常高。 软件开发系统学…

Linux--档案/目录 权限及修改
首先所有权限对于三类用户分别设定: User(所有者) / Group(组群) / Others(其他)。 权限也是有三种:Read / Write / eXecute,这三种权限对于文档和目录有不同的意义。 1. 对于文档: Read:可以查看文档的内容 Write&…
sklearn:Python语言开发的通用机器学习库
引言:深入理解机器学习并全然看懂sklearn文档,须要较深厚的理论基础。可是。要将sklearn应用于实际的项目中,仅仅须要对机器学习理论有一个主要的掌握,就能够直接调用其API来完毕各种机器学习问题。本文选自《全栈数据之门》。将向…

资料分享:送你一本《BigONE Developer API V2》电子书!
背景 昨天,我推送了一篇技术图文《如何利用 BigOne 的 API 制作自动化交易系统 – 身份验证》,里面提到了 BigONE Developer API V2。为了方便自己也方便他人,所以把这份文档整理成 PDF。如果大家对封装 BigONE 提供的 API 感兴趣可以下载这…

Web前端培训面试攻略
学会web前端技术之后,接下来就是要找到一份合适的工作,今天小编要跟大家分享的文章是关于web前端面试攻略,做好这些可以给面试环节加分,找到合适的工作几率会更高,希望本篇文章能够对大家有所帮助。 Web前端培训…

微软鲍尔默回应被苹果超越:将开发更好产品
针对苹果超过微软成为全球市值最高的高科技公司的消息,微软首席执行官史蒂夫鲍尔默 (Steve Ballmer)周四表示,其目标是开发更好的产品,提高盈利能力。鲍尔默周四在印度首都新德里说,“我每天思考的是如何改进产品、如何使产品更 具…

技术图文:如何利用C#实现Huffman编码?
背景 Huffman编码 在通信和数据压缩领域具有重要的应用。 在介绍 Huffman 编码具体实现之前,先介绍几个相关的概念。 概念1:树中结点的带权路径长度 – 根结点到该结点的路径长度与该结点权值的乘积。 概念2:树的带权路径长度 – 树中所有…

ELK 5.x日志分析 (二) Elasticserach 5.2 安装
2019独角兽企业重金招聘Python工程师标准>>> 解压安装包到/opt/elasticsearch 目录下面 [roots1-prod-it-web01 opt]# tree -L 1 elasticsearch/ elasticsearch/ ├── bin ├── config ├── lib ├── LICENSE.txt ├── modules ├── NOTICE.txt ├── …

什么样的人适合学习UI?
UI时代的到来,让我们的生活都多姿多彩,很多企业越来越注重UI设计这方面,想要学习UI设计的人也越来越多,暗恶魔什么样的人适合学习UI呢? 什么样的人适合学习UI? 目前的UI设计很多都是停留在手机端设计,网页࿰…

Uva 10074【递推dp】
UVa 10074 题意:求01矩阵的最大子0矩阵。 http://www.csie.ntnu.edu.tw/~u91029/MaximumSubarray.html#2 这里说的很清楚。先求Largest Empty Interval,枚举每个点为矩形的右下角。 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<…

金融时报:谷歌撤离中国有99.9%的可能性
据国外媒体报道,英国《金融时报》周六发表文章称,谷歌与中国政府就监管问题的谈判显然陷入僵局,而这家世界最大的搜索引擎关闭中国业务现在有99.9%的可能性。《金融时报》称,谷歌已经制定了关闭中国搜索引擎的详细计划。该报援引一…

技术图文:匿名方法是怎样演变为Lambda表达试的?
背景 “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda 表达式基于数学中的 λ演算得名,直接对应于其中的 lambda 抽象(lambda abstraction),是一个匿名函数,即没有函数…

python和c++的相互调用教程
日常工作中会遇到需要python与cpp代码之间的相互调用,工作的应用复杂,都是取决于代码的多少,但是总的方法不变,这里用两个简单例子说明下,有兴趣的筒子可以探讨下~~ 我的测试环境:ubuntu1604,py…

技术图文:如何通过 LINQ 查找集合中的重复数据?
背景 在前几天介绍的 如何利用C#实现Huffman编码? 的图文中有以下代码。 private List<HuffmanTreeNode> CreateInitForest(string str) {if (string.IsNullOrEmpty(str))throw new ArgumentNullException();List<HuffmanTreeNode> result new List&…

mysql的基本知识
安装:http://www.cnblogs.com/sshoub/p/4321640.html 导库 http://www.cnblogs.com/yuwensong/p/3955834.html 报错:Error was: No module named PIL pip install image转载于:https://www.cnblogs.com/baldermurphy/p/7403778.html

msys下产生dll的导入库
有些时候在只有一个dll的情况下,如果需要隐式链接的话,就需要为该dll产生一个导入库.注意导入库是不能跨编译器使用的,在mingw中导入库需要以.a结尾,而vs则以.lib 以下的方法是在Msys产生mingw及vs 的导入库 , 打开MSys工具 首先生成dll库的d…

零基础小白如何学习好UI设计
智能时代的来临,很多企业都越来越注重用户体验这一块,想要有一个吸引用户的好页面,UI设计师岗位不可或缺,如今越来越多的人想要学习UI设计技术,那么对于零基础小白如何学习好UI设计呢? 零基础小白如何学习好UI设计? …

技术图文:如何利用BigOne的API制作自动化交易系统 -- 获取账户资产
背景 前几天我们介绍了如何使用 BigONE Developer API V2 来获取身份令牌的方法「如何利用BigOne的API制作自动化交易系统 – 身份验证」。一旦获取了身份令牌,我们就可以在网络请求的 header 中加入令牌来获取自己的账户数据,创建买入、卖出订单&#…

『网站升级』PHPWind8.0至8.3升级过程及问题种种回顾录
上星期的PHPWind杭州峰会之后,PHPWind发布了8.3版。紧接着淘连接,淘满意,团购PHPWind的一系统ARP应用开始进入我们公司技术苦力的耳朵里(也就是偶),偶知道有大事要发生了。于是乎。领导悠然降至,…

新浪 抓取详情页
转载于:https://www.cnblogs.com/tian-sun/p/7404493.html

零基础如何学习软件测试
很多人想学软件测试是因为软件测试是进入到IT行业里比较快的一门技术,软件测试的门槛比较低,初学者和零基础小白学起来都是比较容易的,下面小编就详细的给大家介绍一下具体零基础如何学习软件测试? 零基础如何学习软件测试?对于初级测试而言…
VPS使用初体验
很早就想建个人网站,但是出于各种限制,一直没有实施。前几天开通了网银,便再次萌发了建站的想法。。。 购买一个了enom的域名,然后寻找比较好的虚拟主机,发现ubuntuchina上有个卖vps的,价格还行,…