进度条的使用,主要是先算出它的max

解决方案 »

  1.   

    用进度条?考虑用时间控件显示执行的时间吧sql Server上的quarry都没精确表示所用的进度,只是意思了一下而已。主要的是执行的时间也可以考虑和你cn的timeout做进度条
      

  2.   

    Private WithEvents DBCn As ADODB.Connection
    Private WithEvents DBRs As ADODB.Recordset
    Private DBCmd As ADODB.CommandPrivate Sub Test()
        Set DBRs = New ADODB.Recordset
        
        With DBRs
            .Source = "select top 20000 * from chipinfo "
            .CursorType = adOpenStatic
            .LockType = adLockReadOnly
            .CursorLocation = adUseClient
            Set .ActiveConnection = DBCn
            .CacheSize = 1000
            .Open , , , , adAsyncFetch + adAsyncExecute  '还有其它参数,可参考相关文档。
        End With
        
        Set DBCmd = New ADODB.Command
        
        With DBCmd
            .CommandType = adCmdStoredProc
            .CommandText = "GetFullPath"
            .Parameters.Refresh
            Set .ActiveConnection = DBCn
            .Parameters("@Type").Value = "Department"
            .Parameters("@Id").Value = tmpID
            .Parameters("@Pathcode").Value = "\"
            .Execute , , adAsyncExecute    '还有其它参数,可参考相关文档。
            FullPath = .Parameters("@FullPath").Value
        End With
        '上述的两个执行都是以异步方式的,就是在.Open  和 .Execute 后都是立即返回,
        '在执行完毕时会激发DBCn的ExecuteComplete事件.
        '对于执行时间比较长的过程可以使用这种方法,再加上一个时间控件定期显示当前状态就可以了。
        '如果是用RS返回记录集,还可以先设置DBRs的CacheSize,并在DBRs的FetchProgress事件里得到当前已获取的量和总量,
        '就可以做一个进度条,更准确的反应当前进度了,而对于用DBCmd执行存储过程,刚不好实现进度条显示当前进度,
        '只好以动画来反应当前过程正在执行了,没有好的方法.
    End SubPrivate Sub DBCn_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)
        '这个事件在三种情况下被触发:
        '1.DBCn.Execute,,adasyncexecute
        '2.Set DBRs.ActiveConnection = DBCn
        '  DBRs.Open , , , ,adAsyncExecute
        '3.Set DBCmd.ActiveConnection = DBCn
        '  DBCmd.Execute , , adAsyncExecute
        '返回的参数对象分别就是上面说的三个ADO对象.
    End Sub
    Private Sub DBRs_FetchProgress(ByVal Progress As Long, _
                                   ByVal MaxProgress As Long, _
                                   adStatus As ADODB.EventStatusEnum, _
                                   ByVal pRecordset As ADODB.Recordset)
        '这个事件在DBRs以.Open , , , , adAsyncFetch + adAsyncExecute方式打开时被触发
        '根据CacheSize的大小定期返回,Progress是当前返回的量,MaxProgress是总量.
        '这时可以考虑使用进度条.
    End Sub****************************************
    如上所说,用CMD对象执行存储过程时,不适合使用进度条,因为没有时时返回的当前进度和总量,所以不容易做到;但RS返回记录集时可以使用进度条.