最近在搞一个数据库方面的系统,开始我将所有的数据
源类与各窗体都放到同一个工程,所有的功能都能正常工作,但是
后来我把所有的数据源类放到另一个工程,准备生成一个
ActiveX Dll的方式来实现,在调试时,就出现了俩个问题:1.当数据更改时,DBGrid的数据并没有刷新,开始我
  以为是DBGrid的数据刷新(调用Refsh没用)问题,后来才发现其实是因为
 为DBGrid提供数据源类的RecordSet也并没有重新从数据源类提取数据,没有刷新!在
  我分离代码之前,DBGrid及数据源类的RecordSet通过RecordSet
  的一次CLose和Open方法都能刷新,分离之后,这个数据源类的
  RecordSet的Close方法始终无法关闭它,所以调用open方法是报错“
  对象打开时,操作不允许”。我还发现Recordset(ADO2.7)没有Refsh方法。
 调用RecordSet的Requery也报错。  说明:我的RecordSet是调用数据源类内部的Command的Execute方法,(
      set rs=command.Execute )从Access调用存储过程得到的。
      Connection的游标类型CursorLocation是adClient的。2.我在客户端(窗体模块)声明的一个WithEventS RecordSet 
  (clientRecordSet),将数据源类的RecordSet赋给它,clientRecordSet的MoveComplete事件却并不被触发。不知道什么原因?我猜问题集中在客户端游标和服务器端游标上,也可能是个BUG!各位高手,请帮帮忙!在此谢过!

解决方案 »

  1.   

    我在DLL中写了一个OPEN方法,用于获取指定条件的数据,每当前台界面数据变更后,界面就重新调用一次这个OPEN方法,这样数据就肯定会更新了,不要去绑定
      

  2.   

    添加
    if recordset.state<>0 then
        recordset.close
    end if
    如果还有问题联系
      

  3.   

    2的一个问题的部分代码:'窗体模块变量
     Public WithEvents stoProsRs As ADODB.Recordset...............set stoProRs=ActiveDll的某个数据源类的RecordSet '此数据源类运行时绑定到DBGrid.............
    'stoProsRs的MoveComplete事件,在与DBGrid绑定数据源类的RecordSet记录移动时
    '能被触发(当数据源类是私有类),担当此数据源类放到ActiveDll就不能工作
    Private Sub stoProsRs_MoveComplete(ByVal adReason As ADODB.EventReasonEnum,   
                                       ByVal pError As ADODB.Error, adStatus As 
                                       ADODB.EventStatusEnum, ByVal pRecordset As  
                                        ADODB.Recordset)
       On Error GoTo err
       '**************
        ...... 
       '代码部分....
        ....... err:
       If err.Number = 3021 Then
          CStoPros.Recordset.MoveLast
       End If
    End Sub