2010-05-12 2 views
1

J'essaie d'ajouter des données à mysql d'Excel. Je reçois l'erreur ci-dessus sur cette ligne: rs.Open strSQL, oConn, adOpenDynamic, adLockOptimisticconnexion à mysql à partir d'Excel: Pilote ODBC ne supporte pas les propriétés demandées

voici mon code:

Dim oConn As ADODB.Connection 

Private Sub ConnectDB() 
    Set oConn = New ADODB.Connection 
    oConn.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _ 
     "SERVER=localhost;" & _ 
     "DATABASE=employees;" & _ 
     "USER=root;" & _ 
     "PASSWORD=some_pass;" & _ 
     "Option=3" 

End Sub 

Function esc(txt As String) 
    esc = Trim(Replace(txt, "'", "\'")) 
End Function 


Private Sub InsertData() 
Dim rs As ADODB.Recordset 
    Set rs = New ADODB.Recordset 
    ConnectDB 
    With wsBooks 
     For rowCursor = 2 To 11 
      strSQL = "INSERT INTO tutorial (author, title, price) " & _ 
       "VALUES ('" & esc(.Cells(rowCursor, 1)) & "', " & _ 
       "'" & esc(.Cells(rowCursor, 2)) & "', " & _ 
       esc(.Cells(rowCursor, 3)) & ")" 
      rs.Open strSQL, oConn, adOpenDynamic, adLockOptimistic 
     Next 
    End With 
End Sub 

ce qui est erroné avec rs.Open strSQL, oConn, adOpenDynamic, adLockOptimistic? Pourquoi est-ce que j'obtiens l'erreur odbc?

Répondre

3

INSERT ne renvoie pas un jeu d'enregistrements. Utilisez oConn.Execute pour effectuer ce type d'insertion.

Une autre option pourrait être cette version particulière du pilote mysql ne supporte pas adOpenDynamic (êtes-vous sûr que vous en avez besoin?) Ou adLockOptimistic (même).

Mais de toute façon, ce code est un trou sql injection. Vous devriez envisager d'utiliser des requêtes paramétrées:

dim cm as adodb.command 
set cm=new adodb.command 
set cm.activeconnection = oConn 
cm.commandtype = adcmdtext 
cm.commandtext = "insert tutorial (author, title, price) values (?,?,?)" 
cm.parameters.add cm.createparameter(,adVarChar,adParamInput,50,esc(.Cells(rowCursor, 1))) 
cm.parameters.add cm.createparameter(,adVarChar,adParamInput,50,esc(.Cells(rowCursor, 2))) 
cm.parameters.add cm.createparameter(,adDouble,adParamInput,,esc(.Cells(rowCursor, 3))) 

cm.execute ,, adExecuteNoRecords 
Questions connexes