,这是模块里定义的函数
Public Function Open_rst_from_str(ByVal str As String) As ADODB.Recordset
On Error GoTo er:
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.CursorType = adOpenDynamic
rs.LockType = adLockOptimistic
rs.Open str, conn, , , adCmdText
Set Open_rst_from_str = rs
Set rs = Nothing
Exit Function
er:
Open App.Path & "\日志\日志.txt" For Append As #1
Print #1, Now & " 查询出错 :" & err.Description & " sql: " & str
Close #1
End Function'程序里调用
dim rs As ADODB.Recordset '公共
strSql = "select ……"
Set rs = Open_rst_from_str(strSql)
……
rs.ClosestrSql = "select ……"
Set rs = Open_rst_from_str(strSql)
……
rs.Close不停的调用后内存就爆满了,我想问,
1如上我的代码怎么释放内存呢?
2哪个地方引起的内存没释放呢?
刚接触vb,望大虾能耐心讲解下,项目里非常非常频繁的使用那个函数,有时候1秒内便查询近10次以上,小程序安装在服务器的,长久下去服务器必死啊。。
Public Function Open_rst_from_str(ByVal str As String) As ADODB.Recordset
On Error GoTo er:
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.CursorType = adOpenDynamic
rs.LockType = adLockOptimistic
rs.Open str, conn, , , adCmdText
Set Open_rst_from_str = rs
Set rs = Nothing
Exit Function
er:
Open App.Path & "\日志\日志.txt" For Append As #1
Print #1, Now & " 查询出错 :" & err.Description & " sql: " & str
Close #1
End Function'程序里调用
dim rs As ADODB.Recordset '公共
strSql = "select ……"
Set rs = Open_rst_from_str(strSql)
……
rs.ClosestrSql = "select ……"
Set rs = Open_rst_from_str(strSql)
……
rs.Close不停的调用后内存就爆满了,我想问,
1如上我的代码怎么释放内存呢?
2哪个地方引起的内存没释放呢?
刚接触vb,望大虾能耐心讲解下,项目里非常非常频繁的使用那个函数,有时候1秒内便查询近10次以上,小程序安装在服务器的,长久下去服务器必死啊。。
strSql = "select ……"
Set rs = Open_rst_from_str(strSql)
……
rs.Close
Set rs = NothingstrSql = "select ……"
Set rs = Open_rst_from_str(strSql)
……
rs.Close
Set rs = Nothing
on error goto er 能不能放在 rs.LockType = adLockOptimistic 的后面啊?(因为此前应该不会有错,如果有错最好再做一个 on error 处理段)
这样,在 er: 后面就可以这样了,如:
Public Function Open_rst_from_str(ByVal str As String) As ADODB.Recordset'......
exit function
er:
If rs.State <> adStateClosed Then
rs.Close
End If
set rs = nothing
Open App.Path & "\日志\日志.txt" For Append As #1
Print #1, Now & " 查询出错 :" & err.Description & " sql: " & str
Close #1
end function我认为,如果 rs.open 执行时出错,那么 rs 本身并没有置 nothing 且如果在连接没有关闭的情况下仍会占用内存;如果在 er: 里检查 rs.state,并做 rs.close ,那么在发生错误时也就没有连接了;注意:个人观点,仅供参考;