VB执行SQL语句耗时太久导致程序假死怎么办?

bestofbest 2011-10-10 10:51:25
以前写程序都用DOEVENTS来解决假死的情况,可是最近发现执行SQL语句更新ACCESS数据库的时候这方法没什么用
语句是类似这样的:
update db1 INNER JOIN db2 ON db1.ID=db2.ID SET db1.name=db2.name

其实就是22万行左右,大概就是五到十秒的时间
大家有什么好办法去解决这种假死吗?DOEVENTS没什么效果,还是死得一塌糊涂。。。毕竟程序只是做了一件事而已
...全文
339 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
maogou4260 2011-10-15
  • 打赏
  • 举报
回复
异步操作不就行了?
ningweidong 2011-10-14
  • 打赏
  • 举报
回复
又不是在循环中,doevents是没有用的。
嗷嗷叫的老马 2011-10-13
  • 打赏
  • 举报
回复
如果使用进程外部件,即ActiveX EXE进行耗时工作代理,就只需要设计为事件通知结构就可以了.

耗时操作完成后触发一个事件,主程序等待这个事件,当事件到来时再将虚假的进度条走到100%并维持0.2秒足够让人眼看到,再干掉进度条.

不过这要看你程序结构如何,这决定了改造工作的复杂程度.
咸清 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 aisac 的回复:]

引用 7 楼 veron_04 的回复:
我认为还是DoEvents最好

执行这种更新操作,DoEvents没效果的,除非逐行显示然后更新。。。。。。。

把这个更新动作交给存储过程试试,应该会好很多。
[/Quote]
倾向 存储过程
king06 2011-10-12
  • 打赏
  • 举报
回复
"其它问题" 可能会在异步执行过程中产生,看怎么处理了.
(建议执行异步数据处理的时候定义一个标识值,处理完毕该标志值恢复,别的操作根据这个标志值来处理)
ChinaITOldMan 2011-10-12
  • 打赏
  • 举报
回复
时间不长,弹出一个提示就可以了,选择异步可能带来其他问题
lyserver 2011-10-12
  • 打赏
  • 举报
回复
不管是用存储过程还是直接用SQL语句,大数据量操作都会造成假死,可以尝试以下思路:
将一次性执行分成多次执行,比如全表替换,为了较好的用户体验,可以逐行替换,然后在循环里加DoEvents配合显示一个进度条。
或者,使用VB多线程技术(如ActiveX EXE)异步执行,主线程循环中加DoEvents等待执行数据操作的线程结束的信息。
或者,使用SQL SERVER 2005以上版本支持的Service Broker,构建一个异步信息,在信息接收端执行数据操作,具体步骤可GOOGLE网站的SQL SERVER异步触发器。
jhone99 2011-10-11
  • 打赏
  • 举报
回复
时间不长,弹出一个提示就可以了,选择异步可能带来其他问题
king06 2011-10-11
  • 打赏
  • 举报
回复
异步执行就不会假死了,不过执行未完时最好不要作对这个过程有影响的操作.
Private WithEvents Css As ADODB.Connection
'''''''
Css.Execute "update table1 set a='x',b='y' ", , adAsyncExecute

Private Sub css_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
On Error GoTo EE
MsgBox "更新完毕."
Css.Close:Set Css = Nothing
Exit Sub
EE:
Set Css = Nothing
End Sub
神马都能聊 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 veron_04 的回复:]
我认为还是DoEvents最好
[/Quote]
执行这种更新操作,DoEvents没效果的,除非逐行显示然后更新。。。。。。。

把这个更新动作交给存储过程试试,应该会好很多。
贝隆 2011-10-11
  • 打赏
  • 举报
回复
我认为还是DoEvents最好
bestofbest 2011-10-11
  • 打赏
  • 举报
回复
多谢,我来试试异步操作。。。我只是怕程序失去响应,让用户误认为死机,那就不太好了
-晴天 2011-10-11
  • 打赏
  • 举报
回复
几十万条数据的更新,不应该在客户端来完成吧.
如果一定要用VB来执行这样的语句,可以考虑用个进度条控件来指示"数据正在处理中".
worldy 2011-10-10
  • 打赏
  • 举报
回复
其实就是22万行左右,大概就是五到十秒的时间
应该很快了,你可以在执行之前,弹出一个提示框,提示正在执行耗时的操作
生命密码 2011-10-10
  • 打赏
  • 举报
回复
应该不至于啊,先在Access里试试,能不能正常执行。
看看代码别的地方会不会有问题
如果确实没问题执行时间比较长的话可以自己写个多线程后台执行,不过VB实现有点复杂。

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧