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返回记录集时可以使用进度条.
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返回记录集时可以使用进度条.