2017-08-31 140 views
1

當此vba代碼嘗試打開記錄集時,出現以下錯誤: 運行時錯誤'3709' 該連接無法用於執行此操作。在這種情況下,它是封閉的或無效的。無法在vba中打開記錄集

Set objMyConn = New ADODB.Connection 
Set objMyRecordset = New ADODB.Recordset 
Dim strSQL As String 

objMyConn.ConnectionString = "Driver={SQL Server};Server=localhost\SQLEXPRESS;Database=Contact;Trusted_Connection=True;" 
objMyConn.Open 

strSQL = "Select * from Contact where Lastname like " + Chr(39) + LastSearch + "%" + Chr(39) + " And Firstname like " + Chr(39) + FirstSearch + "%" + Chr(39) 

MsgBox strSQL 

objMyRecordset.Open strSQL, cnn, adOpenForwardOnly, adLockOptimistic 
+2

這是什麼'cnn'?這不應該是'objMyConn'嗎? –

回答

0

在您的模塊的頂部添加Option Explicit;你會發現VBE尖叫着那個未聲明的cnn變量。

您的記錄集未使用任何打開的連接 - 正如錯誤消息所述。

這就是說你可以很好地在字符串文字裏面有單引號;那Chr(39)東西只是無用地混淆了代碼。

也可以考慮使用參數。如果您不確定原因,請閱讀Little Bobby Tables


下面是一個例子:

Option Explicit 

Sub Test() 
    Dim conn As ADODB.Connection 
    Set conn = New ADODB.Connection 

    conn.ConnectionString = "Provider='SQLOLEDB';Data Source='INSTANCE NAME';Initial Catalog='DATABASE NAME';Integrated Security='SSPI';" 
    conn.Open 

    Dim sql As String 
    sql = "SELECT Field1 FROM dbo.TestTable WHERE Field3 LIKE '%' + ? + '%'" 

    Dim results As ADODB.Recordset 
    With New ADODB.Command 
     .ActiveConnection = conn 
     .CommandType = adCmdText 
     .CommandText = sql 
     .Parameters.Append .CreateParameter(Type:=adVarChar, Value:="foo", Size:=255) 

     Set results = .Execute 

    End With 

    Debug.Print results(0).Name, results(0).Value 

    results.Close 
    conn.Close 
End Sub 

注意到它的執行關閉Connection回報一個RecordsetCommand

+0

謝謝。感到驚訝,我沒有看到。我有選擇明確,但我沒有得到變量聲明投訴.... – Luv

+0

@Luv所以它的聲明。我的開源項目[Rubberduck](http://rubberduckvba.com)會撿起它 - 它會發佈一個使用未分配變量的檢查結果(假設它是一個局部變量)。試一試! –

0

這裏的通用ADODB連接建立

Dim con As New ADODB.Connection 
Dim rs As New ADODB.Recordset 
Dim strConnection As String 

strConnection = "connectionString" 
con.Open strConnection 
rs.Open "SELECT * FROM Tbl", con