由于系统的需求,需要做一个从EXCEL导入数据插入数据库的操作,通常是一两百条数据一次性循环插入,但是连续做几次这样的操作(从EXCEL导入)的时候就会导致连接数据库超时,结果查看时数据库管理的那个进程信息有大量的进程。
小弟不才不能解决这个问题,请教园子里的各位大哥如何在大批量插入数据又能够使那个进程信息能够及时释放。
(附图)
图1:(数据库活动监视器的进程信息)
图2:(每个进程信息都是这样的,只是插入的数据值不同)
我也遇到过,后来我直接把文件缩小了才搞定它,实在不行就写个C#程序吧,一次读10出来再做插入..
insert into tb
select * from opendatasource(.....)
这样操作的吗?
增加CommandTimeout时间,我都是设置成600
楼主首先应该找到问题:
一:200条数据一般是不会致死的。所以是否是连接重复打开或打开没有关闭?
二、可以用BULK Insert
http://technet.microsoft.com/zh-cn/library/ms188365.aspx
可以一次性构建
inser into XXX (a,b,c,d)
select 'a1','b1','c1','d1' union
select 'a2','b2','c2','d2' union
…… ……
select 'aN','bN','cN','dN'
避免连接重复打开关闭
将sql超时时间设置长一点,web.config中可以设置
insert into products(SKU,尺码)
select 物料号,尺码 from openrowset('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=yes;IMEX=1;DATABASE=D:\0605\推广器架物料.XLS',[Sheet1$])
这种方式基本上在n多数据时才会超时。要是再超时可以
在Global文件里设 Server.ScriptTimeout = 600;
在webconfig里<system.web>下 设 <httpRuntime maxRequestLength="51200" executionTimeout="600"/>
如果用的是数据源控件(如SqlDataSource),要在控件的Selecting的事件里设 e.Command.CommandTimeout = 600;