C#-asp.net开发的B/S系统,需要将Excel导入数据库。
如题,需要将Excel导入数据库,由于数据量特别大。如果加事物导入的话,导入起来会对数据库造成很大压力,但是如果不加事物,一条一条的像数据库中添加的话,中途断了就需要重新导入。这样会产生很多重复数据。请问各位高手这个该如何解决阿。有没什么解决方案点拨一下小弟?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你可以在excel中添加一列作为标记列,验证不通过的数据加上标记,不放入dataset,通过的数据放入dataset,这样我们一次只将对的数据放到dataset中,并且更新数据库,下次我们打开excel看那些错了(最好是把错误信息也写入到标记列)这样改对了再次导入,当然这样做只能减少你导入的次数,并不能缩短一次导入数据的时间。
如果要优化速度,应该从验证入手,凭经验大部分速度问题是由于做了多余的操作,特别是数据多的时候更明显。
不知道你的导入的数据量达到多少?
我也遇到过这种问题,但后来发现,所用的时间,70%都是excel的读取时间,反而数据库写入时间并不长。
我的方法是在单机上导入,逐条从excel读入后,并不直接写入数据库,而是写入单机中独立的同结构的DataSet中。
在全部读取完毕后,再一次性连接数据库,把DataSet保存入数据库中。
保存数据并不只是写入数据库,还会首先建立导入记录,分配唯一的导入编号。这样,在出问题,或需要删除过往的导入记录时,可以一次性根据唯一的导入编号,删除数据库中被导入的数据。
采用这个方法,即使在读取excel过程中出错,那么会在写入数据库之前中断。如果在读取完毕后,写入数据库的过程中出错。那么可以通过唯一的导入编号,删除掉之前导入的数据,纠正错误后,重新再倒入。或者是直接try/cache方式直接回滚掉写入的数据。
这样可以保持数据的准确性及唯一性。
用这个方法,目前每次3份,每份excel数据量是单一份表格的最大容量。虽然导入的时间会长点,那个无法改善,因为excel读取方式已经固定了,也决定了它的读取速度。但数据完整性是可以保证的。
我是做C/s架构的,也经常遇到将excel中的数据导入输入数据库的需求,不过我一般分两步做,第一步把excel的数据读取进DataTable对象里,第二步使用事务一条一条插(这里可以偷懒,用适配器查询出一个空的DataTable对象,然后把Excel的数据插入这个DataTable表中,这样的话,更新就可以使用适配器一次更新了),不过网上方法很多,自己可以参考一下,至于你说到的数据量很大,个人觉得读取Excel的耗时更长,所以不要读一条数据插一条数据
1)先确定是否有办法区分出excel数据记录行的唯一性,如果可以,自己来维护事务,比如通过时间戳,主键等
2)大数据量,建议使用bluk copy,性能差别非常之大