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 '
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 '
'RST对象被销毁,那GETRST的值还有用吗,
试试就知道。
Set Rst = Nothing 'RST对象被销毁,那GETRST的值还有用吗,再就是RST是一个临时变量,取得的记录集是不是随之消失。 GETRST还能返回记录吗?如果Rst 有值,即使被销毁了,GetRst 的值还有用.
根据您的意思,我可否这样理解,取得的数据集是太阳,RST和GetRst是两面镜子,并且比较特殊的一点是,如果是这两面镜子都销毁了,这个太阳也就不存在了,只要有一面镜子指向这个太阳,这个太阳就是存在的。并且还有一个问题是,这两面镜子都有名称:RST和GetRST,但这个太阳的名字为什么一直没有出现过,并且一开始Rst仅是一个局部变量,他取得的这个数据集也应该是在Rst这个局部变量的生命周期中有效吧。真难理解。
Set GetRst = Rst
Set Rst = Nothing
Set Conn2 = Nothing
这样写完全没有问题,不会影响GetRst的存在....
2、再就是RST是一个临时变量,取得的记录集是不是随之消失?
3、GETRST还能返回记录吗?1、从你的程序看Set Rst = Nothing即GETRST= Nothing 它们是同一个东西。
2、是。
3、不能。
对象变量也是变量,楼主这个过程最通俗的可以如下理解:function fun() as long
dim a as long
a=100
fun=a
end function这个过程完成,fun=100,但过程级变量a已经不存在了....
那你的意思是 问题3 GETRST还可以返回记录集,您的意思与猴哥的相反。 是否是说 一开始 RST生成的数据集是独立于RST变量存在的,也就是说RST仅是一面镜子,RST消失了,只要还有变量引用RST所指向的数据集,这个数据集就一直存在,与RST所能存在的过程的生命期无关。谢谢,bcrun,你的答案对我是很重要的。但我不知道你和猴哥谁的答案更权威一些。
set rst=new adodb.recordset '实例化一个记录集对象,也就是对象变量rst引用 了一个实际对象,引用计数1
'.....
set GetRst=rst 'GetRst引用了一个实际对象,实际对象引用计数2set rst=nothing '引用-1
一个实例可以被多个变量引用(包括其他实例中的内部变量),只有所有解除了变量对实例的引用(引用计数归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