以前写程序都用DOEVENTS来解决假死的情况,可是最近发现执行SQL语句更新ACCESS数据库的时候这方法没什么用
语句是类似这样的:
update db1 INNER JOIN db2 ON db1.ID=db2.ID SET db1.name=db2.name其实就是22万行左右,大概就是五到十秒的时间
大家有什么好办法去解决这种假死吗?DOEVENTS没什么效果,还是死得一塌糊涂毕竟程序只是做了一件事而已

解决方案 »

  1.   

    应该不至于啊,先在Access里试试,能不能正常执行。
    看看代码别的地方会不会有问题
    如果确实没问题执行时间比较长的话可以自己写个多线程后台执行,不过VB实现有点复杂。
      

  2.   

    异步执行就不会假死了,不过执行未完时最好不要作对这个过程有影响的操作.
    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
      

  3.   

    执行这种更新操作,DoEvents没效果的,除非逐行显示然后更新。把这个更新动作交给存储过程试试,应该会好很多。
      

  4.   

    不管是用存储过程还是直接用SQL语句,大数据量操作都会造成假死,可以尝试以下思路:
    将一次性执行分成多次执行,比如全表替换,为了较好的用户体验,可以逐行替换,然后在循环里加DoEvents配合显示一个进度条。
    或者,使用VB多线程技术(如ActiveX EXE)异步执行,主线程循环中加DoEvents等待执行数据操作的线程结束的信息。
    或者,使用SQL SERVER 2005以上版本支持的Service Broker,构建一个异步信息,在信息接收端执行数据操作,具体步骤可GOOGLE网站的SQL SERVER异步触发器。
      

  5.   

    如果使用进程外部件,即ActiveX EXE进行耗时工作代理,就只需要设计为事件通知结构就可以了.耗时操作完成后触发一个事件,主程序等待这个事件,当事件到来时再将虚假的进度条走到100%并维持0.2秒足够让人眼看到,再干掉进度条.不过这要看你程序结构如何,这决定了改造工作的复杂程度.
      

  6.   

    又不是在循环中,doevents是没有用的。