-----------------
关闭了连接对象,可是企业管理器中的进程号依然存在,以前整个程序只用一个连接不会出现这个问题,但听说要采用即用即连的方式才好,所以改成即用即连,但却出现了这个问题,如何解决呀?
我反复测试,发现,如果只打开一个连接进程号,conn.close后,企业管理器中的进程号就没有了,但是只要同时打开了一个以上的连接进程号,就无法再关闭了.[前提是我定义的是窗体级的连接对象,如果是一个按钮中的就会即时释放.]
以下我把类代码写出来,我定义一个窗体级的对象时出现这个问题的.我已经在窗体的unload事件中set nothing了.
类代码如下:
Option Explicit
Public dbconn As adodb.Connection '连接对象
Public rs As adodb.Recordset '记录集
'-------------------------------
'连接服务器函数
'-------------------------------
Public Function ConnectToServer() As Boolean
On Error GoTo errhandler:
If Not dbconn Is Nothing Then
If dbconn.State = adStateOpen Then
dbconn.Close
End If
Else
GoTo errhandler
End If
'connstr是一个全局变量,存贮连接串
With dbconn
.ConnectionString = connstr
.ConnectionTimeout = 6
.Open '连接
End With
If dbconn.Errors.Count = 0 Then
'MsgBox "连接时无错"
ConnectToServer = True
Else
MsgBox "conn时出错"
ConnectToServer = False
End If
Exit Function
errhandler:
MsgBox "打开数据库错误!", vbCritical
ConnectToServer = False
End Function
'-------------------------------
'执行一个sql语句,得到一个记录集
'-------------------------------
Public Function GetRecordSet(StrSQL As String) As adodb.Recordset
On Error GoTo errhandler
If Trim(StrSQL) = "" Then
Exit Function
End If
If Not rs Is Nothing Then
If rs.State = adStateOpen Then
rs.Close
End If
End If
Set rs = Nothing
Set rs = New adodb.Recordset
If ConnectToServer = True Then
'必须要用客户端游标
rs.CursorLocation = adUseClient
rs.Open StrSQL, dbconn
Set GetRecordSet = rs
Else
MsgBox "与服务器连接失败!", 32, "提示"
End If
Exit Function
errhandler:
MsgBox Err.Description
End Function
'关闭连接
Private Function CloseConnect() As Boolean
On Error GoTo errhandler
If Not dbconn Is Nothing Then
If dbconn.State = adStateOpen Then
dbconn.Close
End If
End If
Set dbconn = Nothing
CloseConnect = True
Exit Function
errhandler:
MsgBox Err.Description
End Function
'关闭记录集
Private Function CloseRecordSet() As Boolean
On Error GoTo errhandler
If rs.State = adStateOpen Then
rs.Close
End If
Set rs = Nothing
Exit Function
errhandler:
MsgBox Err.Description
End Function
'类初始化
Private Sub Class_Initialize()
On Error GoTo errhandler
Set dbconn = New adodb.Connection
Exit Sub
errhandler:
MsgBox Err.Description
End Sub
'释放类
Private Sub Class_Terminate()
' MsgBox "释放类"
On Error GoTo errhandler
Call CloseRecordSet
Call CloseConnect '关闭连接
Exit Sub
errhandler:
MsgBox Err.Description
End Sub
5 个解决方案
#1
我只知道要用close才能关闭进程,而set =nothing不会
另外关闭程序也会
另外关闭程序也会
#2
我只知道要用close才能关闭进程,而set =nothing不会
另外关闭程序也会
------------------
是的,我是先close,然后set =nothing的.我发现,只要企业管理器中只有一个进程号时,控制是正常的,只要close就会关闭.可是只要企业管理器中有两个以两个以上的连接进程,那么任何一个连接进程号都不不可控的了.好象ado在底层在做什么自动处理一样,不可控了.这是什么原因呀,大家试试.
另外关闭程序也会
------------------
是的,我是先close,然后set =nothing的.我发现,只要企业管理器中只有一个进程号时,控制是正常的,只要close就会关闭.可是只要企业管理器中有两个以两个以上的连接进程,那么任何一个连接进程号都不不可控的了.好象ado在底层在做什么自动处理一样,不可控了.这是什么原因呀,大家试试.
#3
set = nothing 是释放本地对象的内存
close 是关闭连接
管理器里活动刷新了吗?
close 是关闭连接
管理器里活动刷新了吗?
#4
管理器里活动刷新了吗?
------------
刷新后看的.是最新状态
------------
刷新后看的.是最新状态
#5
up
#1
我只知道要用close才能关闭进程,而set =nothing不会
另外关闭程序也会
另外关闭程序也会
#2
我只知道要用close才能关闭进程,而set =nothing不会
另外关闭程序也会
------------------
是的,我是先close,然后set =nothing的.我发现,只要企业管理器中只有一个进程号时,控制是正常的,只要close就会关闭.可是只要企业管理器中有两个以两个以上的连接进程,那么任何一个连接进程号都不不可控的了.好象ado在底层在做什么自动处理一样,不可控了.这是什么原因呀,大家试试.
另外关闭程序也会
------------------
是的,我是先close,然后set =nothing的.我发现,只要企业管理器中只有一个进程号时,控制是正常的,只要close就会关闭.可是只要企业管理器中有两个以两个以上的连接进程,那么任何一个连接进程号都不不可控的了.好象ado在底层在做什么自动处理一样,不可控了.这是什么原因呀,大家试试.
#3
set = nothing 是释放本地对象的内存
close 是关闭连接
管理器里活动刷新了吗?
close 是关闭连接
管理器里活动刷新了吗?
#4
管理器里活动刷新了吗?
------------
刷新后看的.是最新状态
------------
刷新后看的.是最新状态
#5
up