问题点:用WithEvents 定义的RecordSet,,无法作为参数正常传递。
‘注:如果去掉WithEvents,则程序可正常执行。
Dim WithEvents mRs As ADODB.Recordset 
Private Sub cmdReset_Click()
  Dim strSQL As String
  strSQL = "Select Top 20 LogID from tblLog"
  Set mRs = New ADODB.Recordset
  mRs.Open strSQL, mdb, adOpenKeyset, adLockBatchOptimistic  ‘注:此时,mRs.RecordCount=20
  ReSetRecordSet mRs   
 ‘注:此时,mRs.RecordCount还是20,但是,应该是10才对。End SubPrivate Sub ReSetRecordSet(ByRef pRecordset As ADODB.Recordset)
  Dim strSQL As String
  strSQL = "Select Top 10 LogID from tblLog "
  Set pRecordset = New ADODB.Recordset
  pRecordset.Open strSQL, mdb, adOpenKeyset, adLockBatchOptimistic '注:此时,pRecordset.RecordCount=10
End Sub

解决方案 »

  1.   

    猜测可能是由于绑定事件的对象初始化后,其内存地址不能改变造成的
    楼主可将ReSetRecordSet中
    Set pRecordset = New ADODB.Recordset 
    这一行替换成 
        If pRecordset.State = 1 Then
            '如果记录集已打开,则关闭
            pRecordset.Close
        End If然后,可以在窗体的LOAD事件中初始化mRs
    Set mRs = New ADODB.Recordset 然后,在其他打开 mRs 之前,都关闭记录集,或者用完后就关闭记录集
      

  2.   

    WithEvents 的变量应该有一些事件绑定相关的自动处理。
    在显式更改 mRs 时会调用(其实就是 VB 编译器对 Set mRs = 语句添加了额外的处理功能);而在 ReSetRecordSet() 中 pRecordset 是没有该特性的。
    并且在 mRs 作为参数时可能自动作了不可更改的限定。试试将 ReSetRecordSet() 改成函数,调用改为 mRs = ReSetRecordSet()
      

  3.   

    Set mRs = New ADODB.Recordset 去掉试试
      

  4.   

    我試過了的,用SET mRs = ReSetRecordSet()這樣的語句沒有問題。
    因為:它就不是通過參數傳遞來實現的。
    但是,我還是想找一個辦法:直接通過pRecordset修改來實現,不用明確指定來源recordset。
    原因:想使代碼更簡潔。我有數百個語句,調用ReSetRecordSet。如果來源recordset都需要明確定指,則過程的靈活性降低了,因為:要多數個百個類似的語句,SET mRs = ReSetRecordSet。
      

  5.   

    将 ReSetRecordSet mRs 更改为 SET mRs = ReSetRecordSet() 用任何批量文本修改工具就可以做到,根本不影响所谓的灵活性。
    而且你根本不使用旧的 pRecordset 实例,从参数更改为函数返回值更直观。