c/s程序中.采用随用随连的方式连接数据库,可是企业管理器中的进程号越来越多,如何解决呀?

时间:2022-05-31 21:44:11
c/s程序中.采用随用随连的方式连接数据库,可是企业管理器中的进程号越来越多,如何解决呀?
-----------------
关闭了连接对象,可是企业管理器中的进程号依然存在,以前整个程序只用一个连接不会出现这个问题,但听说要采用即用即连的方式才好,所以改成即用即连,但却出现了这个问题,如何解决呀?

我反复测试,发现,如果只打开一个连接进程号,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在底层在做什么自动处理一样,不可控了.这是什么原因呀,大家试试.

#3


set = nothing 是释放本地对象的内存
close 是关闭连接

管理器里活动刷新了吗?

#4


管理器里活动刷新了吗?
------------
刷新后看的.是最新状态

#5


up

#1


我只知道要用close才能关闭进程,而set =nothing不会
另外关闭程序也会

#2


我只知道要用close才能关闭进程,而set =nothing不会
另外关闭程序也会
------------------
是的,我是先close,然后set =nothing的.我发现,只要企业管理器中只有一个进程号时,控制是正常的,只要close就会关闭.可是只要企业管理器中有两个以两个以上的连接进程,那么任何一个连接进程号都不不可控的了.好象ado在底层在做什么自动处理一样,不可控了.这是什么原因呀,大家试试.

#3


set = nothing 是释放本地对象的内存
close 是关闭连接

管理器里活动刷新了吗?

#4


管理器里活动刷新了吗?
------------
刷新后看的.是最新状态

#5


up