Fehler bei SQL und Wahr oder FalschWenn man eine SQL-Abfrage per VBA zusammensetzt und dabei Bool’sche Werte per Parameter einfügt, kommt es zu Problemen: VBA bastelt die Ausdrücke True und False beziehungsweise 0 und -1 in Wahr und Falsch um. Das Folgende beschreibt, wie es trotzdem funktioniert. BeispieldatenbankDie nachfolgenden Schritte können mit der Funktion BoolToText im Modul mdlTools, der Funktion SampleBoolToText im Modul mdlBoolToText und der Tabelle tblBoolToText der Beispieldatenbenk AccessSQLDotNet.mdb nachvollzogen werden.


Umwandeln von bool’schen Werten verhindernDamit Access den bool’schen Wert nicht in einen der beiden Werte ‚Wahr’ oder ‚Falsch’ umwandelt, muss man ihm einfach zuvorkommen. Dazu fügt man der Routine, die den SQL-Ausdruck zusammensetzt, einfach eine Hilfsfunktion an den Stellen hinzu, wo bool’sche Werte vorkommen.
Die folgende Funktion funktioniert beispielsweise nicht:
Public Function SampleBoolToText_NotWorking()
Dim strSQL As String
Dim bol As Boolean
bol = True
strSQL = "INSERT INTO tblBoolToText(BooleanValue) VALUES(" & bol & ")"
DoCmd.RunSQL strSQL
End Function
Die Ursache ist leicht zu finden, indem man einmal den resultierenden Ausdruck strSQL ausgeben lässt:
INSERT INTO tblBoolToText(BooleanValue) VALUES(Wahr)
Access wandelt den Bool’schen Ausdruck in den entsprechenden deutschen Wert aus. Diesen erkennt Access nicht und hält ihn für einen Parameter.
Damit das nicht passiert, verwendet man die folgende Hilfsfunktion:
Public Function BoolToString(bol As Boolean) As String
If bol = True Then
BoolToString = "True"
Else
BoolToString = "False"
End If
End Function
In obiger Funktion eingesetzt sieht das ganze wie folgt aus:
Public Function SampleBoolToText_Working()
Dim strSQL As String
Dim bol As Boolean
bol = True
strSQL = "INSERT INTO tblBoolToText(BooleanValue) VALUES(" & BoolToString(bol) & ")"
DoCmd.RunSQL strSQL
End Function
Die Funktion wandelt den bool’schen Wert entweder in die Zeichenkette True oder False um. Da die Funktion den Datentyp des zu verwendenden Wertes auf String ändert, sieht Access in der Folge keinen Anlass mehr, den Wert einzudeutschen. |