Public Function GetConnStr() As String   ' 得到数据库连接字符串,用户可以在此处设置连接字符串GetConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\A.mdb;…. "End FunctionPublic Function OpenConn(ByRef Conn2 As ADODB.Connection) As Boolean '打开数据库连接,连接成功返回true,出错时返回false    Set Conn2 = New ADODB.Connection    Conn2.Open GetConnStr
    OpenConn = True
 End Function Public Function GetRst(ByVal SQL As String, ByRef msg As String) As ADODB.Recordset  '执行SQL语句,返回ADODB.Recordset    Dim Conn2 As ADODB.Connection , Rst As ADODB.Recordset , sTokens() As String        If OpenConn(Conn2) Then            Set Rst = New ADODB.Recordset            Rst.CursorLocation = adUseClient            Rst.Open SQL, Conn2, adOpenDynamic, adLockOptimistic'取得记录集            Set GetRst = Rst                  '将取得的记录集        End If Finally_Exit:    Set Rst = Nothing    Set Conn2 = Nothing    Exit FunctionErrorHandle:    msgstring = "查询错误: " & err.Description    MsgBox msgstring    Resume Finally_ExitEnd Function以上程序中:
   Rst.Open SQL, Conn2, adOpenDynamic, adLockOptimistic'取得记录集
   Set GetRst = Rst                  '将取得的记录集赋值给GetRst 
 Finally_Exit:
    Set Rst = Nothing                'RST对象被销毁,那GETRST的值还有用吗,再就是RST是一个临时变量,取得的记录集是不是随之消失。     GETRST还能返回记录吗?
    Set Conn2 = Nothing             '

解决方案 »

  1.   

    代码不全。
    'RST对象被销毁,那GETRST的值还有用吗,
    试试就知道。
      

  2.   

    VB对象是以引用的方式传递,从你的代码看,不必用Set rst = nothing
      

  3.   

     Set GetRst = Rst '将取得的记录集赋值给GetRst  
      Set Rst = Nothing 'RST对象被销毁,那GETRST的值还有用吗,再就是RST是一个临时变量,取得的记录集是不是随之消失。 GETRST还能返回记录吗?如果Rst 有值,即使被销毁了,GetRst 的值还有用.
      

  4.   


    根据您的意思,我可否这样理解,取得的数据集是太阳,RST和GetRst是两面镜子,并且比较特殊的一点是,如果是这两面镜子都销毁了,这个太阳也就不存在了,只要有一面镜子指向这个太阳,这个太阳就是存在的。并且还有一个问题是,这两面镜子都有名称:RST和GetRST,但这个太阳的名字为什么一直没有出现过,并且一开始Rst仅是一个局部变量,他取得的这个数据集也应该是在Rst这个局部变量的生命周期中有效吧。真难理解。
      

  5.   

    rst是过程级对象变量,即使不显式的nothing,也会在这个过程结束后自动的消毀,所以只要不用close方法:
    Set GetRst = Rst   
    Set Rst = Nothing 
    Set Conn2 = Nothing
    这样写完全没有问题,不会影响GetRst的存在....
     
      

  6.   

    1、RST对象被销毁,那GETRST的值还有用吗?
    2、再就是RST是一个临时变量,取得的记录集是不是随之消失?
    3、GETRST还能返回记录吗?1、从你的程序看Set Rst = Nothing即GETRST= Nothing 它们是同一个东西。
    2、是。
    3、不能。
      

  7.   

    Set Rst = Nothing作用就是将对象变量Rst与实际对象分离,与对象变量GetRst无关...
    对象变量也是变量,楼主这个过程最通俗的可以如下理解:function fun() as long
        dim a as long
        a=100
        fun=a
    end function这个过程完成,fun=100,但过程级变量a已经不存在了....
     
      

  8.   

    是否需要销毁对象是看引用计数是否复0的吧,你说的Set Rst = Nothing只是将计数减一.
      

  9.   


    那你的意思是 问题3 GETRST还可以返回记录集,您的意思与猴哥的相反。  是否是说 一开始 RST生成的数据集是独立于RST变量存在的,也就是说RST仅是一面镜子,RST消失了,只要还有变量引用RST所指向的数据集,这个数据集就一直存在,与RST所能存在的过程的生命期无关。谢谢,bcrun,你的答案对我是很重要的。但我不知道你和猴哥谁的答案更权威一些。
      

  10.   

    dim rst as adodb.recordset   '声明一个记录集对象
    set rst=new adodb.recordset  '实例化一个记录集对象,也就是对象变量rst引用 了一个实际对象,引用计数1
    '.....
    set GetRst=rst  'GetRst引用了一个实际对象,实际对象引用计数2set rst=nothing '引用-1
      

  11.   

    对象实例和对象变量的概念不清!
    一个实例可以被多个变量引用(包括其他实例中的内部变量),只有所有解除了变量对实例的引用(引用计数归0),实例才会被释放。这里有两个实例
    甲 : New ADODB.Connection
    乙 : New ADODB.RecordsetPublic Function GetRst(ByVal SQL As String, ByRef msg As String) As ADODB.Recordset
        Dim Conn2 As ADODB.Connection, Rst As ADODB.Recordset, sTokens() As String
        
        If OpenConn(Conn2) Then
        '通过函数调用,变量 Conn2 引用实例 甲'
        
            Set Rst = New ADODB.Recordset
            '变量 Rst 引用新创建的实例 乙'
            
            Rst.CursorLocation = adUseClient
            
            Rst.Open SQL, Conn2, adOpenDynamic, adLockOptimistic
            '打开记录后,实例 乙 的内部会对实例 甲 有引用'
            
            Set GetRst = Rst
            '(函数返回值)变量 GetRst 引用实例 乙'
        End If
    Finally_Exit:
        Set Rst = Nothing
        '解除 Rst 对实例 乙 的引用'
        
        Set Conn2 = Nothing
        '解除 Conn2 对实例 甲 的引用'
        
        Exit Function
        '由于 GetRst 引用实例 乙,所以 乙 不释放'
        '又由于 乙 引用实例 甲,所以 甲 也不释放'
        
    ErrorHandle:
        msgstring = "查询错误: " & Err.Description
        MsgBox msgstring
        Resume Finally_Exit
    End Function