vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Datenbanken · Sonstiges   |   VB-Versionen: VB4, VB5, VB618.12.01
Vorsicht! bei parametisierten SQL-Abfragen

Ein paar Hinweise, die zu beachten sind, wenn man parametisierte SQL-Abfragen verwendet.

Autor:   Dieter OtterBewertung:  Views:  31.151 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11kein Beispielprojekt 

SQL-Abfragen sind was ganz feines
Interessant wird es vor allem dann, wenn man keine statischen SQL-Abfragen verwendet, sondern eben variable Abfragen, d.h. der Abfrage-Ausdruck selbst setzt sich aus ein- oder mehreren Parametern (Variablen) zusammen.

Statische SQL-Abfrage

' Beispiel für eine statische SQL-Abfrage
"SELECT * FROM Adressen WHERE Name = 'Meier'"

Variable SQL-Abfrage

' Beispiel für eine parametisierte SQL-Abfrage
"SELECT * FROM Adressen WHERE Name = '" & strName & "'"

Jetzt werden Sie sich fragen: "Was spielt es für eine Rolle, ob man im obigen Beispiel den Namen nun direkt angibt oder über die String-Variable strName? Wo sollte es da zu Problemen kommen? Auf was sollte man denn da besonders achten?"

Fallbeispiel
Der Anwender Ihrer Software sucht innerhalb der Adress-Datenbank nach dem Kunden Meier. Den gesuchten Namen gibt er logischerweise in ein Text-Eingabefeld ein und klickt auf OK. Sie "generieren" nun den SQL-String, der wie folgt aussieht:

' SQL-Abfragestring
Dim SQL As String
Dim Rs As Recordset
 
SQL = "SELECT * FROM Adressen WHERE Name = '" & txtSuch.Text & "'"
Set Rs = Db.OpenRecordset(SQL)

Als Ergebnis erhält man nun alle Datensätze, bei denen im Feld 'Name' der gesuchte Eintrag gespeichert ist. Das funktioniert auch ziemlich lange einwandfrei, es gibt also keinerlei Reklamation seitens des Anwenders.

Nun kommt der Tag x, jener Tag, an dem der Anwender zum Hörer greift und Ihnen mitteilt: Beim Suchen nach einem Kundennamen erscheint plötzlich der Laufzeitfehler 3075 - Syntaxfehler (fehlender Operator) in Abfrageausdruck....

Was nun? Warum ging's jahrelang gut und auf einmal erscheint eben genannter Fehler? Hmm... Welchen Namen hat denn der Anwender im Suchfeld eingegeben? Nun ja, er wollte einfach den Datensatz des Kunden O'Neil bearbeiten.

O'Neil? - Halt! Was sucht denn das Hochkomma da im Namen?
Und genau da liegt das Problem. Und genau jetzt verstehen Sie, warum unser heutiger Tipp lautet: Vorsicht! bei parametisierten SQL-Abfragen.

Was ist zu tun? Wie kann man dem vorbeugen?
Ich habe es mir angewöhnt, variable Sucheingaben zunächst in einer Funktion auf Sonder-/Spezialzeichen testen zu lassen. Die kleine aber hilfreiche Funktion habe ich SQLExpr genannt (SQLExpression = SQL-Ausdruck):

Die nachfolgende Funktion prüft, ob im angegebenen String Hochkommas vorhanden sind und ersetzt diese durch doppelte Hochkommas, so dass es zu keinem unerwarteten Fehler im SQL-Abfragestring kommt.

Public Function SQLExpr(ByVal sExpr As String) As String
  Dim sPos As Integer
 
  sPos = -1
  Do
    sPos = InStr(sPos + 2, sExpr, "'")
    If sPos > 0 Then
      sExpr = left$(sExpr, sPos) + "'" + Mid$(sexpr, sPos + 1)
    End If
  Loop Until sPos = 0
 
  SQLExpr = sExpr
End Function

Unter Einbeziehung der SQLExpr-Funktion sieht der SQL-Abfragestring dann folgendermassen aus...

' SQL-Abfragestring
Dim SQL As String
Dim Rs As Recordset
 
SQL = "SELECT * FROM Adressen WHERE Name = '" & _
  SQLExpr(txtSuch.Text) & "'"
Set Rs = Db.OpenRecordset(SQL)

...und Sie bekommen keine lästigen Anrufe seitens der Anrufer mehr
 



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.