c#之mysql四种带事务批量插入

疫情期间:作诗一首
历时两月抗疫情,我国人民绝对行,多数城市渐解封,世界疫情又在增,中国派出救援队,牺牲精神大无畏,一省就能顶一国,千万同胞不退缩,两国关系心相接,江苏奋勇去巴铁,难耐邻国把他弃,四川前往意大利,滴水之恩我们讲,上海立马飞伊朗,广东支援伊拉克,凯旋归来齐庆贺,美国扎心也不愁,大家期待你加油

         特此声明 不得转载  转载必究

对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到数据库,如果循环打扰我数据库,数据库也会觉得很累,从而增加数据库服务器压力。所以小子不才,根据平时经验总结了一下用到的批量插入的方法代码。本文是针对c#语言开发,数据库是mysql数据库。当然我这是单片机的本地电脑运行,跟服务器上有很大区别,到了服务器上可能跑的比这快的多,话不多说看下文。

一 生成数据

简而言之吧,就拿五万数据实验吧,这里面我就收集了五万条数据

c#之mysql四种带事务批量插入

 二 批量方法代码

第一种:采用mysql中MySql.Data.MySqlClient.MySqlBulkLoader

c#之mysql四种带事务批量插入

c#之mysql四种带事务批量插入

看到了这种耗时只需要406毫秒,刺激不,惊喜不,意外不,这个逻辑是先把数据集合转化成table,然后再把table转成csv文件保存到临时文件夹,再利用MySqlBulkLoader对象加载这个csv文件,这个过程是最消耗时间的,最后事务提交,这是最快的方式,五百万数据执行42秒,,

后期开发中发现一个问题:就是对于数据库如果是bit类型,这个字段在维护bool的时候,数据库默认始终插入1,所以解决办法(1)改数据库字段为int类型(2)在手动拼接csv文件时候如果这个字段值为true,就加入这个字段。,如果为false,就去掉这个字段。

还有一个问题就是 如果并发操作时候,这个临时csv文件不重复问题,对于这种问题,我已经解决了,,就是在每次生成文件的时候加一个永远 不重复的随机数作为文件名,当一个事务完成后就删除这个文件名,

这样就解决了并发(并行)问题,,经过后期网上讨论有人说 csv文件对特殊数据格式比如特殊字符 不兼容,,但是 我试了,可以,没有特殊字符格式问题。

第二种:常规拼接sql

c#之mysql四种带事务批量插入

我们看到了对于五万条数据 ,这种拼接sql方法只用了866毫秒级,这种方式最大的好处就是效率快快快,劣势就是拼接繁琐,没有防参数化注入。

第三种:SqlDataAdapter的批量更新DataTable集合

c#之mysql四种带事务批量插入

首先我们了解一下SqlDataAdapter

它是 DataSet和 SQL Server之间的桥接器。SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射 Fill(它可填充DataSet中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet中的数据)来提供这一桥接。当SqlDataAdapter填充 DataSet时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。

总的来说,批量更新数据需要的对象主要有三个有:

SqlDataAdapter核心对象

 SqlCommand 总共需要四个,分别对应数据表的select、add、update、delete操作。具体解释一下。对一张数据表,可能执行四种操作,就是增加、删除、修改、查询,当SqlDataAdapter最后提交操作时,会根据数据表中的每一条记录的标志(增加、删除、修改、查询)来使用对应的SqlCommand对它(一条记录)进行操作,所以需要四个。

 DataSet或DataTable等存储待更新到数据库中的数据。

 这样,我们为了实现数据表的批量更新,可以先把数据表查询到DataSet或DataTable中,然后对其进行各种修改,最后写回到数据库中。

第四种:Dapper自带内部集合插入

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpyws.html