درست اینه که هیچ وقت هیچ کانکشنی رو باز نگه نداشت و هر زمان که لازم داشتید همون زمان Connection رو باز کنید و همون زمان هم ببندید شاید بگید این روش کند میشه ولی در اصل اینطور نیست و OLEDB یا ODBC از تکنیکی استفاده می کنند به نام Connection Pooling که این کاهش سرعت رو جبران میکنه. هر زمان نیاز به یک Recordset یا انجام یک دستور SQL داشتید میتونید مثل روش زیر اونو بگیرید


Option Explicit
Private connectionString As String

Public Function GetRecordSet(ByRef rsResult As ADODB.Recordset, ByVal CommandText As String) As Long
'

Dim cn As ADODB.Connection

Set cn = New ADODB.Connection
With cn
.connectionString = connectionString
.CursorLocation = adUseClient
.Open
End With

If rsResult Is Nothing Then rsResult = New ADODB.Recordset
If rsResult.State = adStateOpen Then rsResult.Close

rsResult.Open CommandText, cn
If Not (rsResult.EOF Or rsResult.BOF) Then
GetRecordSet = rsResult.RecordCount
End If

'Unmark this line if you don't need connected recordsets
'rsResult.ActiveConnection = Nothing

cn.Close
Set cn = Nothing
'
End Function

Public Function ExecuteSQL(ByVal CommandText As String) As Long
'

Dim cn As ADODB.Connection
Dim lngTemp As Long

Set cn = New ADODB.Connection
With cn
.connectionString = connectionString
.CursorLocation = adUseClient
.Open
End With

Call cn.Execute(CommandText, lngTemp)
ExecuteSQL = lngTemp

cn.Close
Set cn = Nothing
'
End Function