首页新闻找找看学习计划

关于批量插入数据库问题

0
悬赏园豆:5 [待解决问题]

请大家帮忙给个思路.

B/S;  我现在从外面接收个datatable,有1W条数据,然后把 datatable 里的数据插入到数据库中的某表(十几万的数据量), 插入之前要先判断数据库中是否存在记录,不存在则添加;存在则放弃;

我现在的思路是遍历这个datatable,然后跟数据库比较,结果出现超时现象;程序自动退出;

 我知道这样做的坏处就是datatable中的每条记录都要在数据库中去查下,可能是由于这个原因出现超时,程序退出的;

大家有什么好的办法,给个思路;

help_hostwork的主页 help_hostwork | 初学一级 | 园豆:6
提问于:2011-05-19 11:56
< >
分享
所有回答(7)
0

WCF方法可以使用Oneway的形式避免超时

也可以使用异步的处理,参考 http://www.cnblogs.com/2018/category/297520.html

2012 | 园豆:18892 (专家六级) | 2011-05-19 12:36
0

把数据库中对应表的主键读取出来进行对比,如果数据库表中存在此主键,就放弃该条记录,否则保留,最后批量导入数据库中

pstune | 园豆:239 (菜鸟二级) | 2011-05-19 12:53
0

例如
表1:
字段:id、name
表2:
字段:id,name
现在将表1插到表二
select * from 表1 t1 left join 表2 t2 on t1.id!=t2.id
这样就少了你说的插入的时候判断的那步了,如果简单的插入的话可以直接用sql解决效率会高很多

群主 | 园豆:23 (初学一级) | 2011-05-19 12:58
0

你可以考虑使用ODP.NET的Array Binding模式。

Launcher | 园豆:45030 (高人七级) | 2011-05-19 13:21
0

给个思路:

1.把datatable中的数据塞入到数据库的临时表中

2.在db中用临时表和需要对比的表做对比.

 

INSERT INTO B

SELECT A. * FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE A.*=B.*)

changbluesky | 园豆:854 (小虾三级) | 2011-05-19 17:16
0

用事务进行批数据插入,插入时如果你要插入的数据的主键值有就可以了,如果数据库中有这些数据就不会插入成功,如果插入不成功事务会自动回滚,对于客户来说就相当于放弃了插入。

繁华fanhua | 园豆:175 (初学一级) | 2011-05-20 09:25
0

或者有架构上有什么方式避免这个超时,可是在SQL编写方面看来,查询出来结果越少越好,比较次数越少越好。

所以应该是在查询那1W条数据的时候便把数据相同数据排除掉,而不是全部取出再判断。

如有4k条相同的,那么就只取出6k条数据,效率快了。

不知能否解决这个问题,先试试吧。

Singlou@BI | 园豆:235 (菜鸟二级) | 2011-06-22 15:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册