ADO 记录集在创建 16 次后开始建立新连接

ADO record sets start making new connections after 16 creations

这可能是我遇到过的最容易混淆的错误。

这里有一些 VB 代码会产生错误。我对不必创建新记录集这一事实不感兴趣,这是故意触发错误。

Public Module ConnectionSetup

Public ActiveTDConnection As ADODB.Connection

Public Sub ConnectToTD(ByVal userName As String, ByVal Password As String, ByVal dsn As String)

    ActiveTDConnection = New ADODB.Connection

    ActiveTDConnection.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=True;" & _

              "User ID=" & userName & ";Password=" & Password & ";" & _

              "Data Source=" & dsn & ";Mode=Read;" & _

              "UID=" & userName & ";AUTHENTICATION=LDAP;Initial Catalog=(Default)"

    ActiveTDConnection.CommandTimeout = 0

    ActiveTDConnection.Open(ActiveTDConnection.ConnectionString)

End Sub

End Module

Module Module1

 Sub Main()

    ConnectionSetup.ConnectToTD("XXX", "XXX", "XXX")


    Dim DB_qry As String

    Dim sessionQry As String

    Dim i As Integer = 1

    Dim sessionRS As New ADODB.Recordset


    DB_qry = "SELECT TOP 1 * FROM dbc.databases"

    sessionQry = "SELECT COUNT(*) FROM dbc.SessionInfo WHERE userName = 'MyUserName'"


    Do While i <= 18

        Dim DB_rs As New ADODB.Recordset

        DB_rs.Open(DB_qry, ActiveTDConnection)

        sessionRS.Open(sessionQry, ActiveTDConnection)

        ' This starts going up by 1 on each loop, after 16.
        Debug.Print(sessionRS.Fields.Item(0).Value)

        Do While Not DB_rs.EOF

            MsgBox(i)

            i += 1

            DB_rs.MoveNext()

        Loop

        DB_rs.Close()

        DB_rs = Nothing

        sessionRS.Close()

     Loop

 End Sub

第 16 次迭代后,每个新打开的记录集都会生成一个新连接。所以我的代码随机开始冒着超出会话限制的风险。

1.) 为什么会这样?

2.) 我该如何预防?

 Sub Main()

    ConnectionSetup.ConnectToTD("XXX", "XXX", "XXX")


    Dim DB_qry As String
    Dim sessionQry As String

    Dim i As Integer = 1

    Dim sessionRS As New ADODB.Recordset

    DB_qry = "SELECT SESSION"

    sessionQry = "SELECT COUNT(*) FROM dbc.SessionInfo WHERE userName = 'MyUserName'"


    Do While i <= 18

        Dim DB_rs As New ADODB.Recordset

        DB_rs.Open(DB_qry, ActiveTDConnection)

        sessionRS.Open(sessionQry, ActiveTDConnection)

        ' This starts going up by 1 on each loop, after 16.
        'Debug.Print(sessionRS.Fields.Item(0).Value)

        Do While Not DB_rs.EOF

            MsgBox("Sessions: " & sessionRS.Fields.Item(0).Value & " Cnt: " & i & " SID: " & DB_rs.Fields.Item(0).Value)

            i += 1

            DB_rs.MoveNext()

        Loop

        DB_rs.Close()
        DB_rs = Nothing
        sessionRS.Close()

     Loop

 End Sub