Access Anfänger: Anführungszeichen und Apostrophe

Aus DBWiki
Wechseln zu: Navigation, Suche

String-Begrenzungszeichen

Ohne Begrenzungszeichen weiß eine Programmiersprache nicht, was eine Variable, was ein reserviertes Wort und was jetzt eine Text-/Stringkonstante sein soll - oder anders gesagt: Man muss Stringkonstanten in Begrenzungszeichen einschließen, um sie als solche zu kennzeichnen. Diese Notation ist übrigens nicht auf VB(A) beschränkt, sondern gilt für fast jede Programmiersprache.

SQL = "SELECT * FROM MeineTabelle"

Problematisch wird es dann, wenn das Begrenzungszeichen selbst Teil des Strings werden soll, hier gilt eine einfache

Wiki hinweis.png Regel: Begrenzungszeichen innerhalb einer Stringkonstante sind zu verdoppeln

Also

X = "explorer.exe ""C:\Programme\Microsoft Office\MSAccess.EXE"""

wird zu

explorer.exe "C:\Programme\Microsoft Office\MSAccess.EXE"

Alternativ kann man auch schreiben:

X = "explorer.exe " & Chr(34) & "C:\Programme\Microsoft Office\MSAccess.EXE" & Chr(34)

da das Anführungszeichen dem ASCII-Code 34 entspricht.

Begrenzungszeichen innerhalb von SQL

Wenn man nun in einer VBA-Anweisung SQL erzeugen will, ist es ein bisschen komplizierter, weil es Begrenzungszeichen auf 2 Ebenen geben kann - die äußeren Anführungszeichen für VBA und die inneren Apostrophe (es könnten auch Anführungszeichen sein, die schreiben sich nur etwas schwerer, siehe unten) für die aus diesem VBA-String resultierende SQL.

Also z.B.

SQL = "Firma = '" & Firma & "' AND SeminarNr = " & SeminarNr

nach Einsetzen der Variablen bzw. Formularfelder steht dann beispielsweise folgendes in der String-Variablen SQL:

Firma = 'xyz' AND SeminarNr = 123

Man kann das ganze wunderbar im Debug-Modus austesten, indem man den Ausdruck im Direktfenster auswertet und mit dem Resultat in die SQL-Ansicht des Abfrageentwurfs geht. (Siehe auch SQL - was ist das?).

Die Grundregel für ein derartiges Filter-Kriterium ist, dass es einer SQL-WHERE-Klausel ohne das Wörtchen "WHERE" entsprechen muss, zum Testen muss man also in der SQL-Ansicht des Abfrageeditors noch "SELECT * FROM MeineTabelle WHERE" ergänzen, also:

SELECT * FROM MeineTabelle WHERE Firma = 'xyz' AND SeminarNr = 123

Sollte dort ein SQL-Fehler drin sein - also z.B. ein Datentyp falsch sein - bekommt man dann die fehlerhafte SQL um die Ohren gehauen.

Wie oben schon gesagt, kann man auch in SQL anstelle der Apostrophe Anführungszeichen verwenden, die muss man dann allerdings - wie erwähnt - in VBA verdoppeln, also

SQL = "Firma = """ & Firma & """ AND SeminarNr = " & SeminarNr

oder auch (wobei man sich über die Lesbarkeit streiten kann):

SQL = "Firma = " & Chr(34) & Firma & Chr(34) & " AND SeminarNr = " & SeminarNr

was dann beides zu

Firma = "xyz" AND SeminarNr = 123

wird.

Begrenzungszeichen innerhalb der zu substituierenden Variablen

Es kann aber nun sein, dass im obigen Beispiel im Formularfeld "Firma" ein Wert eingegeben wird, der seinerseits das verwendete Begrenzungszeichen enthält. Nach der Substitution des Feldinhalts entsteht also z.B. folgende SQL:

Firma = 'O'Hara Enterprises' AND SeminarNr = 123

was natürlich zu einem Fehler führt. Man könnte jetzt auf die erwähnte Verwendung von Anführungszeichen anstelle der Apostrophe ausweichen, eine echte Lösung ist das allerdings nicht, denn es können ja genau so auch Anführungszeichen im Formularfeld eingegeben werden. Eine saubere Lösung verdoppelt wiederum das Begrenzungszeichen, also:

SQL = "Firma = '" & Replace(Firma,"'","''") & "' AND SeminarNr = " & SeminarNr

womit dann die korrekte SQL

Firma = 'O''Hara Enterprises' AND SeminarNr = 123

produziert wird.

Parameterabfragen verwenden

Um bessere Performance zu erreichen sowie die Sicherheit zu verbessern und oben gezeigte Probleme mit Sonderzeichen in SQL-Strings zu vermeiden, sollte man stattdessen Parameterabfragen definieren und füllen, wo immer es möglich ist.

Siehe auch: Warum man Parameterabfragen vermeiden sollte (bzw. warum nicht)