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
这可能是我遇到过的最容易混淆的错误。
这里有一些 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