往数据库里插入上万条纪录是程序无响应,怎么办?

时间:2022-08-16 23:24:28
程序的功能是将文本文件的内容导入到数据库,当这个文本文件中有好几万条纪录是,每次导入2万多条时,程序就没有响应了。
数据库是:SQL Server 连接方式是:ADO 
程序里就是读一行数据然后insert到数据库里。应该不是读文本文件导致程序死掉。应该是做了2万多个insert后,程序死掉了。在调试状态下,会有一个连接超时的错误。如何解决这个问题?

22 个解决方案

#1


建议使用bcp,这方面的帖子很多,搜索一下吧。

#2


学习,没有加过这么多!

#3


好办,你在导入时加一个进度条显示导入进度就行了吧

#4


楼上说的什么意思?
我的问题是大量的操作数据库导致程序无响应(不过有时候插入4万条都没问题,只是慢了一点,而有时候指插入2万多行就无响应了了)。
ljianq:
bcp?我查查

#5


插1000条就重新断开、重连接一次试试

#6


为什么不用缓存更新呢?先写入到内存里,再一次性写入多条记录。这样可以少用几次insert操作,即可写入所有数据。

#7


同意 ljianq(泉深水清)
或者
设置SQL Server 及客户端的超时时间。 
具体去SQL Server版块查。

#8


不过bcp唯一麻烦的就是必须要至少安装一个Sql server客户端

#9


我以前也遇到此类情况,需要一批将16个原始文件(每个文件处理后大约有5万多条记录),
处理后加入数据库
在INSERT数据时在128M内存,C533的机器上会出现几分钟的程序不反应,直到处理完为止。

后来实际用时换了P4 512M的工控机,
预处理原始文件后,存入有5万条记录的数组中,然后再提交数据库,
虽然还有迟钝,但比程序不反应强多了。

另外:如果数据库量比较大的话,最好按周或月分不同的表

#10


如果是这样的话,可以尝试分段操作,提交到一定数量的记录时,中断连接,然后再连接数据库,再继续,应该可以解决这个问题,或者把文本文件拆分成小文件.

#11


bcp是什么?
 
galaxyseeker(星空):如何用缓存减少insert的次数?即使在缓存里,一条纪录也得insert一次呀?

现在发现不是程序死掉,只是在任务管理器里进程是"未响应"的状态,实际上程序在不停的忘数据库insert纪录,直至程序正常结束。

#12


我是要查询好几十万条记录,然后向listView里写入,更慢,愁

#13


cuiyu616ok(大宇) :
   你是说你查询的结果有10几万条吧?但是你每次显示只要几十条就行了,你可以想办法每次只查出需要显示的纪录,用户“上一页”“下一页“是你在查出对应的纪录。

各位关注一下我的问题如何解决?

#14


commandtimeout设置为0试试

#15


学习,没有加过这么多!

我一直以为"未响应"的状态,就是程序死了呢.

#16


同意 wxcwuxuchun(清风) 的观点:
 
  如果是这样的话,可以尝试分段操作,提交到一定数量的记录时,中断连接,然后再连接数据库,再继续,应该可以解决这个问题,或者把文本文件拆分成小文件.

但是有个问题,如果只是执行一条sql语句,这条语句的量很大,该怎么分段呢?
  
 

#17


application->processmessage();

#18


----回复人: zhaowd() ( ) 信誉:99 

先尽可能的对语句进行效率优化,
然后实在不行了 只能给用户提供个状态进程显示了。。。让他们慢慢等吧。

//或者是采取措施避免用户这样大数据量的查询,限制一下。

#19


我的问题用 BCBX(曾牧暗鲨_在深圳漂)的办法可以解决。
application->processmessage();

各位提的其它的方法对减轻数据库的压力都是好办法哦!

#20


用线程可以么?

#21


才2 万就挂了,SQL Server不会这么脆弱,可能是程序的问题

#22


Application->ProcessMessages();               
        if(Stop)
        break;
在form上设置一个按钮,定为中断,把这条语句加到循环中,然后按中断即可中断你的操作了。

#1


建议使用bcp,这方面的帖子很多,搜索一下吧。

#2


学习,没有加过这么多!

#3


好办,你在导入时加一个进度条显示导入进度就行了吧

#4


楼上说的什么意思?
我的问题是大量的操作数据库导致程序无响应(不过有时候插入4万条都没问题,只是慢了一点,而有时候指插入2万多行就无响应了了)。
ljianq:
bcp?我查查

#5


插1000条就重新断开、重连接一次试试

#6


为什么不用缓存更新呢?先写入到内存里,再一次性写入多条记录。这样可以少用几次insert操作,即可写入所有数据。

#7


同意 ljianq(泉深水清)
或者
设置SQL Server 及客户端的超时时间。 
具体去SQL Server版块查。

#8


不过bcp唯一麻烦的就是必须要至少安装一个Sql server客户端

#9


我以前也遇到此类情况,需要一批将16个原始文件(每个文件处理后大约有5万多条记录),
处理后加入数据库
在INSERT数据时在128M内存,C533的机器上会出现几分钟的程序不反应,直到处理完为止。

后来实际用时换了P4 512M的工控机,
预处理原始文件后,存入有5万条记录的数组中,然后再提交数据库,
虽然还有迟钝,但比程序不反应强多了。

另外:如果数据库量比较大的话,最好按周或月分不同的表

#10


如果是这样的话,可以尝试分段操作,提交到一定数量的记录时,中断连接,然后再连接数据库,再继续,应该可以解决这个问题,或者把文本文件拆分成小文件.

#11


bcp是什么?
 
galaxyseeker(星空):如何用缓存减少insert的次数?即使在缓存里,一条纪录也得insert一次呀?

现在发现不是程序死掉,只是在任务管理器里进程是"未响应"的状态,实际上程序在不停的忘数据库insert纪录,直至程序正常结束。

#12


我是要查询好几十万条记录,然后向listView里写入,更慢,愁

#13


cuiyu616ok(大宇) :
   你是说你查询的结果有10几万条吧?但是你每次显示只要几十条就行了,你可以想办法每次只查出需要显示的纪录,用户“上一页”“下一页“是你在查出对应的纪录。

各位关注一下我的问题如何解决?

#14


commandtimeout设置为0试试

#15


学习,没有加过这么多!

我一直以为"未响应"的状态,就是程序死了呢.

#16


同意 wxcwuxuchun(清风) 的观点:
 
  如果是这样的话,可以尝试分段操作,提交到一定数量的记录时,中断连接,然后再连接数据库,再继续,应该可以解决这个问题,或者把文本文件拆分成小文件.

但是有个问题,如果只是执行一条sql语句,这条语句的量很大,该怎么分段呢?
  
 

#17


application->processmessage();

#18


----回复人: zhaowd() ( ) 信誉:99 

先尽可能的对语句进行效率优化,
然后实在不行了 只能给用户提供个状态进程显示了。。。让他们慢慢等吧。

//或者是采取措施避免用户这样大数据量的查询,限制一下。

#19


我的问题用 BCBX(曾牧暗鲨_在深圳漂)的办法可以解决。
application->processmessage();

各位提的其它的方法对减轻数据库的压力都是好办法哦!

#20


用线程可以么?

#21


才2 万就挂了,SQL Server不会这么脆弱,可能是程序的问题

#22


Application->ProcessMessages();               
        if(Stop)
        break;
在form上设置一个按钮,定为中断,把这条语句加到循环中,然后按中断即可中断你的操作了。