Access Anfänger: SQL-gerechte Formatierung von Variablen

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

Ich möchte in einem SQL-String, einem Filter- oder Suchausdruck Variablenwerte wie Datums-, Double-Werte etc. verketten.

Anmerkungen

  • Wenn sich die Anforderung auf eine Parameterabfrage reduzieren lässt, so wäre diese zu bevorzugen.
  • Bei der Erstellung eines Filter- oder Suchausdrucks kann für alle in der Funktion aufgeführten Datentypen auch die Access-Methode BuildCriteria() eingesetzt werden. Diese weist jedoch bei dbText bzw. dbMemo auch ihre Tücken auf, wie sie auch im QBE-Editor bei Eingabe eines Textkriteriums ohne Apostroph bzw. Anführungszeichen zu beobachten sind. Der Textwert abc (4711) würde z. Bsp. zu einem Fehler führen, weil der Ausdruck als Funktion interpretiert werden würde. Außer runden Klammern sind auch eckige Klammern, Punkt und Ausrufezeichen quasi nicht mit BuildCriteria verwendbar, ohne einen Riesenaufwand betreiben zu müssen.
    Fazit: Bei Texten verlässt man sich besser auf einen Ausdruck, wie er auch in der Funktion unter dbText, dbMemo aufgeführt ist. Bei allen anderen hier aufgeführten Datentypen kann BuildCriteria() bedenkenlos eingesetzt werden.

Lösung

Dazu sind die Werte der Variablen so in Text umzuwandeln, dass sie konform mit der SQL-Syntax von Access sind.

Folgende Funktion kann dazu in einem globalen Modul hinterlegt werden. Damit werden alle Variablen entsprechend ihrem Datentyp formatiert.

Public Function FormatForSQL(Value As Variant, _
                             ByVal Datatype As DAO.DataTypeEnum) As String
 
   'Quelle: www.dbwiki.net oder www.dbwiki.de
 
   If IsNull(Value) Then
      FormatForSQL = "Null"
   Else
      Select Case DataType
         Case dbLong, dbInteger, dbByte, dbDouble, dbSingle, dbCurrency, dbDecimal
            FormatForSQL = Str$(Value)  'LTrim$(Str$(Value)) wäre unnötige Kosmetik
         Case dbText, dbMemo
            FormatForSQL = "'" & Replace(Value, "'", "''") & "'"
         Case dbBoolean
            FormatForSQL = IIf(Value, "True", "False")
         Case dbDate
            FormatForSQL = Format$(Value, "\#yyyy-mm-dd hh:nn:ss\#")
      End Select
   End If
 
End Function


Wiki warning.png

Vorsicht:

Null-Werte funktionieren nicht in Bedingungen (WHERE-Klausel), weil sie als Vergleichsoperator entweder Is Null oder Not Is Null erwarten.


Aufruf

Ein Aufruf erfolgt dann beispielsweise so:

   MSQL = "UPDATE DeineTabelle " & _
          "SET    einDatumFeld = " & FormatForSQL(eineDatumsVariable, dbDate) & " " & _
          "WHERE  einTextFeld  = " & FormatForSQL(eineTextVariable, dbText)

Wikilinks

Weblinks