以前写程序都用DOEVENTS来解决假死的情况,可是最近发现执行SQL语句更新ACCESS数据库的时候这方法没什么用
语句是类似这样的:
update db1 INNER JOIN db2 ON db1.ID=db2.ID SET db1.name=db2.name其实就是22万行左右,大概就是五到十秒的时间
大家有什么好办法去解决这种假死吗?DOEVENTS没什么效果,还是死得一塌糊涂毕竟程序只是做了一件事而已
语句是类似这样的:
update db1 INNER JOIN db2 ON db1.ID=db2.ID SET db1.name=db2.name其实就是22万行左右,大概就是五到十秒的时间
大家有什么好办法去解决这种假死吗?DOEVENTS没什么效果,还是死得一塌糊涂毕竟程序只是做了一件事而已
看看代码别的地方会不会有问题
如果确实没问题执行时间比较长的话可以自己写个多线程后台执行,不过VB实现有点复杂。
Private WithEvents Css As ADODB.Connection
'''''''
Css.Execute "update table1 set a='x',b='y' ", , adAsyncExecutePrivate 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
将一次性执行分成多次执行,比如全表替换,为了较好的用户体验,可以逐行替换,然后在循环里加DoEvents配合显示一个进度条。
或者,使用VB多线程技术(如ActiveX EXE)异步执行,主线程循环中加DoEvents等待执行数据操作的线程结束的信息。
或者,使用SQL SERVER 2005以上版本支持的Service Broker,构建一个异步信息,在信息接收端执行数据操作,具体步骤可GOOGLE网站的SQL SERVER异步触发器。