• 批量数据复制SqlBulkCopy使用经验点滴(特别是超时处理)


      如果要批量复制大量的数据,用ado.net或者其他orm框架逐条读取并写入,有时会耗时太长,满足不了要求,此时SqlBulkCopy就可以出来大显身手了,相信许多人了解或使用过它。

      但实际使用时,还是会遇上些问题,这里做些记录,也许能帮你避开一些“坑”。

    • column mapping 问题 。 在设置column时候,请注意字段的大小写,特别是sql server,平时写sql语句时候可以忽略大小写,但是在这里一定要注意大小写不能错了。
    • 如果目标表中字段比源表中的短,那么源表中有记录的实际数据长度超过目标表的字段,拷贝时会保存,此时检查一下字段长度即可。
    • 超时问题,有时候数据量大时,会遇上错误“在操作完成之前超时时间已过或服务器未响应”。可以设置SqlBulkCopy.BulkCopyTimeout  ,这个属性的单位是秒,默认是30秒。
    • 如果数据量实在大,建议设置SqlBulkCopy.BatchSize 属性,默认是0,即将所有目标数据一股脑儿拷贝到目标表,设置了这个属性,就分批拷贝。 如果设置了batchsize,假设10万条记录,需要10分钟拷贝,timeout要设置超过10分钟,如果设置batchsize=1万,每次只要1分钟,那么timeout只要大于1分钟就可以了。timeout和batch的关系, 微软文档中没有讲明白,经过我的测试,确认timeout是每个batch的时间。
    • SqlRowsCopied 事件。假设拷贝的时间很长,而急性子的你希望能看到目前拷贝了多少数据,就可以使用这个事件,直接来段代码吧
    sqlbulkcopy.NotifyAfter = 10000;
    sqlbulkcopy.SqlRowsCopied += new SqlRowsCopiedEventHandler((object sender,SqlRowsCopiedEventArgs e) =>
     {
          Console.Write("+");
      });
     

     以上代码的效果是,每1万条数据,打印一个+符号到屏幕上。

    参考网址:https://docs.microsoft.com/zh-cn/dotnet/api/system.data.sqlclient.sqlbulkcopy?view=netframework-4.7.2

    (不知道ul-li 列表为啥会变成窄窄的小段落,没办法了)

  • 相关阅读:
    HTTP 错误 500.21
    SQL SERVER 強制指定使用索引 -转载 只为学习
    DevExpress GridControl 导出为Excel
    WCF入门教程一[什么是WCF]--转载只为学习收藏
    Sql查询除ID以外相同的数据
    Step By Step(Lua输入输出库)
    Step By Step(Lua字符串库)
    Step By Step(Lua弱引用table)
    Step By Step(Lua面向对象)
    Step By Step(Lua模块与包)
  • 原文地址:https://www.cnblogs.com/honghuamin/p/10657367.html
Copyright © 2020-2023  润新知