2017-08-31 1 views
1

Lorsque ce code vba tente d'ouvrir le jeu d'enregistrements, j'obtiens l'erreur suivante: Erreur d'exécution '3709' La connexion ne peut pas être utilisée pour effectuer cette opération. Il est fermé ou invalide dans ce contexte.impossible d'ouvrir le jeu d'enregistrements dans 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

Qu'est-ce que 'cnn' ici? Cela ne devrait-il pas être «objMyConn»? –

Répondre

0

Ajouter Option Explicit au sommet de votre module; vous trouverez le VBE criant à cette variable non déclarée cnn.

Votre jeu d'enregistrements n'utilise aucune connexion ouverte - comme le dit le message d'erreur. Cela dit, vous pouvez très bien avoir des guillemets simples dans les littéraux de chaîne; que Chr(39) choses est juste inutile d'obscurcir le code.

Pensez également à utiliser des paramètres à la place. Si vous ne savez pas pourquoi, lisez à propos de Little Bobby Tables.


Voici un exemple:

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 

avis, il est le Command qui exécute au large des Connection et retours un Recordset.

+0

merci. surpris, je n'ai pas vu ça. J'ai eu l'option explicite mais je n'ai pas obtenu la plainte de déclaration variable .... – Luv

+0

@Luv ainsi il est déclaré alors. Mon projet Open Source [Rubberduck] (http://rubberduckvba.com) l'aurait ramassé - il aurait émis un résultat d'inspection pour l'utilisation d'une variable non assignée (en supposant qu'il s'agisse d'une variable locale). Essaie! –

0

Voici connexion ADODB générique mis en place

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