在 IBatisNet 没有 IBatis4Java 的 startBatch() 函数,这让我们批量插入大量数据时很受困扰。本文介绍了如何在 IBatisNet 和 ADO.Net 中批量插入数据。
  说到批量插入,我们有以下解决方案:
   1) 直接执行用 SqlCommand  执行 INSERT 语句,一条一条的插入。无疑,这样效率最低。
   2) 把拼接INSERT 语句,一次插入多条;这样性能不好说,最大的问题就是 SqlCommand  有参数限制(2100个)。
   3) 利用 SqlBulkCopy 或SqlDataAdapter 的 Update 方法,可以实现批量的更新/插入,但是数据是基于  DataRow 的,并且最终 DataRow 还是要转换为 SqlCommand,对于 IBatisNet Mapping,显然我们不想这样做。
  最好能怎么样呢?
  我的思路就是批量执行 SqlCommand,因为 IBatisNet 最终也需要转化 statement 为 DbCommand,因此只要得到把 statement 和 parameters 混合以后的 SqlCommand,就可以了。
   
  首先,我们要能够批量执行  SqlCommand,这里是直接反射调用 SqlDataAdapter 的批处理函数实现的,这些方法受保护,所以只能反射调用。
  代码如下:




然后是我们需要一个批量插入的模板 statement
在 IBatisNet 中实现批处理<insert id="SaveArray" parameterClass="TelnetRecord">
在 IBatisNet 中实现批处理  INSERT INTO [TelnetRecord]([state],[file_name]) VALUES(#State#,#FileName#)
在 IBatisNet 中实现批处理
</insert>

最后是重点,转化 statement 和 parameterObject 为 SqlCommand 并加入批处理操作执行。
在 IBatisNet 中实现批处理public class TelnetRecordDao


经测试,在我的老牛车上速度良好,插入三万条14个字段的记录只需要几秒。
即使不需要使用 IBatisNet,你也也可以使用 SqlBatcher 完成常规的批量的命令执行。
搜了下 cnblogs 和 Google ,没有发现 IBatisNet 对于这个问题的解决方法,于是就自己解决并共享,希望对各位有用。



相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-24
猜你喜欢
  • 2022-12-23
  • 2021-12-12
  • 2021-12-18
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案