2017-01-19 1 views
0

ich mit einem VBScript alle Datensätze aus Bildern sehen kann:MS Access MDB-Abfrage mit VBScript

cn.Execute "SELECT * INTO [text;HDR=Yes;Database=" & exportDir & _ 
";CharacterSet=65001]." & exportFile & " FROM IMAGES" 

Dieses perfekt funktioniert. Allerdings möchte ich nach unten verengen, dass die Suche von allen Aufzeichnungen nur diejenigen, bei denen die Spalte B (Projektname) == „Löffel“

Dim projName 
projName = "spoon" 
cn.Execute "SELECT * INTO [text;HDR=Yes;Database=" & exportDir & _ 
";CharacterSet=65001]." & exportFile & " FROM IMAGES" & " WHERE ProjectName=" & projName 

Aber ich bekomme die Fehlermeldung:

No value given for one or more required parameters.

Mu SQL -fu ist schwach und nicht sicher, wo ich falsch liege.

+0

Stellen Sie sicher, dass Sie Zitate um proj, vielleicht dies: '" WHERE ProjectName = '"& proj &"' "'. Dies ist notwendig, wenn Projektname eine String-Variable ist, wie Sie zu implizieren scheinen –

+2

Ein weiterer Grund (neben SQL-Injektion), String-Verkettung zu vermeiden und SQL-Parameter zu verwenden. –

+1

Ein anderes mögliches Problem: {Dim projName: proj = "löffel"} –

Antwort

0

Zum Schluss (und leicht reduzieren):

Dim projName 
projName = "spoon" 

cn.Execute "SELECT * INTO [text;HDR=Yes;Database=" & exportDir & _ 
";CharacterSet=65001]." & exportFile & " FROM IMAGES WHERE ProjectName='" & projName & "'" 
+0

Dim projjName = "Löffel" sollte Dim projName sein: proj_Name = "Löffel" –

+0

@ Ekkehard.Horner: Richtig bist du - ich hatte VB.NET im Hinterkopf. Vielen Dank. – Gustav

0

Als @allen-wangpoints out der Grund für den Fehler ist der Mangel an String-Wert als String identifiziert werden, indem sie in einfachen Anführungszeichen ('...') eingekapselt wird.

Dieses und andere Probleme wie SQL Injection-Schwachstellen können jedoch vermieden werden, indem ADODB.Command verwendet wird, um eine parametrisierte Abfrage auszuführen.

Dim cmd, sql, exportDir, exportFile 

'Shouldn't be configurable outside this procedure. 
exportDir = "..." 
exportFile = "..." 

Const adCmdText = 1 
Const adParamInput = 1 
Const adCmdVarChar = 200 
Const adExecuteNoRecords = &H00000080 

Set cmd = CreateObject("ADODB.Command") 
sql = "SELECT * INTO [text;HDR=Yes;Database=" & exportDir & _ 
";CharacterSet=65001]." & exportFile & " FROM IMAGES WHERE ProjectName = ?" 
With cmd 
    Set .ActiveConnection = cn 
    .CommandType = adCmdText 
    .CommandText = sql 
    Call .Parameters.Append(.CreateParameter("@ProjName", adVarChar, adParamInput, 255)) 
    Call .Execute(, , adExecuteNoRecords) 
End With 

nur sicherstellen, dass beide exportDir und exportFile nicht ausgesetzt sind, oder verlassen Sie den Code offen für SQL-Injection.