2016-07-14 5 views
1

Ich habe eine Liste von Benutzern (als String-Variable) und möchte sie als Kriterium verwenden (ein Benutzer nach dem anderen), damit mein SQL den Code des ersten Elements auswählt. Daher habe ich eine SQL-Abfrage als Zeichenfolge eingefügt, um sie später im Code auszuführen.Zugriff auf VBA: Variable und Zeichenfolge in SQL-Abfrage kann nicht kombiniert werden

Ich habe dies versucht:

strSQL = "SELECT TOP 1 Item.Code FROM Item WHERE Item.User = '" 
strSQL = strSQL & strUserName & "' ORDER BY ID DESC" 

Wenn die strUserName = "A-Benutzer" zum Beispiel, ich dieses SQL-Zeichenfolge nur erhalten, nach "Schnell Uhr ...":

SELECT TOP 1 Item.Code FROM Item WHERE Item.User = 'A-user 

Der Teil mit "' ORDER BY ID DESC" ist überhaupt nicht im SQL-String enthalten!

Und durch die Verwendung "Set rst = CurrentDb.OpenRecordset(strSQL)" die SQL-Abfrage ausgeführt wird, bekomme ich diesen Fehler:

Run-time error '3075': Syntax error (missing operator) in query expression 'Item.User = "A-user"

Wie kann ich das Problem lösen?

+0

Bitte mehr von Ihrem Code als die Verkettung von Saiten zeigen sollte den aktuell angezeigten Code entsprechend arbeiten. um jedoch eine SQL-Anweisung Aufbau wie so das ist klassische Art der SQL-Injektion ... – DAXaholic

Antwort

1

Ich sehe nicht, wie Sie den Code auslöst, dass 3075 Fehler Allerdings würde ich stattdessen eine Parameter-Abfrage verwenden, die so können Sie Probleme mit angegebenen Werten in der SQL-Anweisung vermeiden.

Dim qdf As DAO.QueryDef 
Dim rs As DAO.Recordset 
Dim strSelect As String 
Dim strUserName As String 

strUserName = "A-user" 
strSelect = "SELECT TOP 1 i.Code FROM [Item] AS i WHERE i.User = [which_user] ORDER BY i.ID DESC" 
Set qdf = CurrentDb.CreateQueryDef(vbNullString, strSelect) 
qdf.Parameters("which_user").Value = strUserName 
Set rs = qdf.OpenRecordset 
+0

Danke! Ich habe noch eine Frage zu Ihrer Antwort. Die 'strSelect =„SELECT TOP 1 i.code FROM [Artikel] AS i WHERE i.User = [which_user] ORDER BY i.ID' würde mir eine SQL-Zeichenfolge mit dem festen/nicht-variable [ which_user] in der SQL, richtig ?. Und die 'qdf.Parameters (" which_user "). Value = strUserName' würde diese behoben [which_user] in der SQL-Zeichenfolge oben? Was ich in die doppelte Anführungszeichen setzen statt "which_user"? Die Variable [which_user] aus der SQL-Zeichenfolge? Thank! – Doug

+0

'which_user' ist ein Parameter. Ein Abfrageparameter ist nichts anderes als ein Platzhalter für einen Wert, den Sie angeben müssen, wenn die Abfrage ausgeführt wird macht mehr Sinn, wenn Sie die Anweisung 'SELECT' in die SQL-Ansicht einer neuen Access-Abfrage einfügen und dann diese Abfrage ausführen:' SELECT TOP 1 i.Code FROM [Ite m] AS i WO i.User = [which_user] ORDER BY i.ID DESC' – HansUp

+0

Danke HansUp. Mein Problem ist, dass ich nicht schaffen kann, die Variable "which_user" Parameter in/in die strSelect einfügen/ändern. Also bleibt meine SQL-Zeichenfolge wörtlich "strSelect =" SELECT TOP 1 i.Code FROM [Element] AS i WHERE i.Benutzer = [which_user] ORDER BY i.ID'. Der [which_user] sollte A_user sein, also das strSelect wäre "strSelect =" SELECT TOP 1 i.Code FROM [Element] AS i WHERE i.User = 'A_user' ORDER BY i.ID 'vor dem" qdf.OpenRecordSet ", richtig? Sorry, ich bin wirklich ein Neuling :) – Doug

0

Access beschwert sich manchmal über die Verwendung von einfachen Anführungszeichen. Und fügen Sie am Ende der Anweisung ein Semikolon hinzu. Versuchen Sie, den Code zu diesem (wo doppelte Anführungszeichen sind mit einem zusätzlichen doppelten Anführungszeichen entronnen..

strSQL = "SELECT TOP 1 Item.Code FROM Item WHERE Item.User = " 
strSQL = strSQL & """" & strUserName & """" & " ORDER BY ID DESC;" 
+0

Aber nach DAXaholic's Kommentar oben, Vorsicht vor SQL-Injektion mit diesem Ansatz – ThunderFrame

+0

Ich habe diese Lösungen ausprobiert, aber es hat nicht geholfen :( http://www.fontstuff.com/access/acctut15.htm Die '&" "" "&" ORDER BY ID DESC; "'in Mein strSQL ist noch abgeschnitten! – Doug

+0

Vielleicht haben Sie einen Tippfehler im Variablennamen 'strSQL'? Beachten Sie auch, dass in meinem Beispiel die Variable in der ersten Zeile zugewiesen wird und dann * an die Variable an der zweiten * angehängt wird (d. H. Die Variable erscheint auf beiden Seiten des '=' -Zeichens in der zweiten Zeile). – ThunderFrame