Mit SQL-Anweisungsparametern können Sie eine wiederverwendbare SQL-Anweisung erstellen. Wenn Sie Anweisungsparameter verwenden, können sich die Werte in der Anweisung ändern (zum Beispiel Werte, die in einer
INSERT
-Anweisung hinzugefügt werden), der grundlegende Text der Anweisung bleibt jedoch unverändert. Die Verwendung von Parametern bietet also Leistungsvorteile und vereinfacht das Kodieren von Anwendungen.
Funktionsweise von Anweisungsparametern
Häufig wird eine einzelne SQL-Anweisung mehrmals in einer Anwendung verwendet, wobei sie jedes Mal leicht verändert wird. Stellen Sie sich zum Beispiel eine Anwendung zur Inventarisierung vor, in der ein Benutzer neue Bestände in die Datenbank eingeben kann. Der Anwendungscode, mit dem ein Bestandselement zur Datenbank hinzugefügt wird, führt eine
INSERT
-SQL-Anweisung aus, mit der Daten zur Datenbank hinzugefügt werden. Jedes Mal, wenn die Anweisung ausgeführt wird, gibt es jedoch eine kleine Änderung. Die eigentlichen Werte, die in die Tabelle eingefügt werden, unterscheiden sich, da sie spezifisch für das hinzugefügte Bestandselement sind.
Wenn Sie eine SQL-Anweisung mehrere Male mit jeweils unterschiedlichen Werten in der Anweisung verwenden, schreiben Sie am besten eine SQL-Anweisung, die Parameter anstelle von Literalwerten im SQL-Text enthält. Ein Parameter ist ein Platzhalter im Text der Anweisung, der bei jeder Ausführung der Anweisung durch einen tatsächlichen Wert ersetzt wird. Zur Verwendung von Parametern in einer SQL-Anweisung erstellen Sie die
SQLStatement
-Instanz wie gewohnt. Für die SQL-Anweisung, die der
text
-Eigenschaft zugewiesen ist, verwenden Sie Parameterplatzhalter anstelle von Literalwerten. Sie definieren dann den Wert für jeden Parameter, indem Sie den Wert eines Elements für die
parameters
-Eigenschaft der SQLStatement-Instanz einstellen. Die
parameters
-Eigenschaft ist ein assoziatives Array, deshalb legen Sie einen bestimmten Wert mithilfe der folgenden Syntax fest:
statement.parameters[parameter_identifier] = value;
Der
parameter_identifier
ist ein String, wenn Sie einen benannten Parameter verwenden, oder eine Ganzzahlenindexnummer, wenn Sie einen unbenannten Parameter verwenden.
Verwenden benannter Parameter
Ein Parameter kann ein benannter Parameter sein. Ein benannter Parameter hat einen bestimmten Namen, den die Datenbank verwendet, um den Parameterwert seiner Platzhalterposition im Text der Anweisung zuzuweisen. Ein Parametername besteht aus dem Zeichen „:“ oder „@“ gefolgt von einem Namen, wie in den folgenden Beispielen:
:itemName
@firstName
Im folgenden Code wird die Verwendung benannter Parameter veranschaulicht:
var sql:String =
"INSERT INTO inventoryItems (name, productCode)" +
"VALUES (:name, :productCode)";
var addItemStmt:SQLStatement = new SQLStatement();
addItemStmt.sqlConnection = conn;
addItemStmt.text = sql;
// set parameter values
addItemStmt.parameters[":name"] = "Item name";
addItemStmt.parameters[":productCode"] = "12345";
addItemStmt.execute();
Verwenden unbenannter Parameter
Alternativ zu benannten Parametern können Sie auch unbenannte Parameter verwenden. Um einen unbenannten Parameter zu verwenden, kennzeichnen Sie einen Parameter in einer SQL-Anweisung mit einem „?“ (Fragezeichen). Jedem Parameter wird entsprechend der Reihenfolge der Parameter in der Anweisung ein numerischer Index zugewiesen. Begonnen wird mit dem Index 0 für den ersten Parameter. Das folgende Beispiel ist eine Variante des vorstehenden Beispiels. In dieser Version werden unbenannte Parameter verwendet:
var sql:String =
"INSERT INTO inventoryItems (name, productCode)" +
"VALUES (?, ?)";
var addItemStmt:SQLStatement = new SQLStatement();
addItemStmt.sqlConnection = conn;
addItemStmt.text = sql;
// set parameter values
addItemStmt.parameters[0] = "Item name";
addItemStmt.parameters[1] = "12345";
addItemStmt.execute();
Vorteile bei der Verwendung von Parametern
Die Verwendung von Parametern in einer SQL-Anweisung hat mehrere Vorteile:
-
Bessere Leistung
-
Eine SQLStatement-Instanz, die Parameter enthält, ist effizienter im Vergleich mit einer Anweisung, bei der der SQL-Text bei jeder Ausführung dynamisch erstellt wird. Die Leistung wird verbessert, da die Anweisung nur ein einziges Mal vorbereitet werden muss und dann viele Male mit unterschiedlichen Parameterwerten ausgeführt werden kann, ohne dass die SQL-Anweisung neu kompiliert werden muss.
-
Explizite Datentypisierung
-
Parameter dienen zur typisierten Ersetzung von Werten, die bei der Konstruktion der SQL-Anweisung unbekannt sind. Nur mithilfe von Parametern kann die Speicherklasse eines an die Datenbank übergebenen Werts sichergestellt werden. Ohne Parameter versucht die Laufzeitumgebung, alle Werte auf der Basis der Typenaffinität der zugewiesenen Spalte von ihrer Textrepräsentation in eine Speicherklasse zu konvertieren.
Weitere Informationen zu Speicherklassen und zur Spaltenaffinität finden Sie unter
Unterstützte Datentypen
.
-
Mehr Sicherheit
-
Die Verwendung von Parametern trägt dazu bei, böswillige Angriffe zu vermeiden, die als SQL-Injection (SQL-Einschleusung) bezeichnet werden. Bei einem SQL-Injection-Angriff gibt ein Benutzer einen SQL-Code an einer für Benutzer zugänglichen Stelle ein (z. B. ein Dateneingabefeld). Wenn der Anwendungscode eine SQL-Anweisung durch die direkte Verkettung der Benutzereingabe mit dem SQL-Text erstellt, wird der vom Benutzer eingegebene SQL-Code an der Datenbank ausgeführt. Das folgende Beispiel zeigt die Verkettung der Benutzereingabe mit dem SQL-Text.
Verwenden Sie dieses Verfahren nicht
:
// assume the variables "username" and "password"
// contain user-entered data
var sql:String =
"SELECT userId " +
"FROM users " +
"WHERE username = '" + username + "' " +
" AND password = '" + password + "'";
var statement:SQLStatement = new SQLStatement();
statement.text = sql;
Indem Sie Anweisungsparameter verwenden, anstatt vom Benutzer eingegebene Werte zum Text einer Anweisung zu verketten, verhindern Sie SQL-Injection-Angriffe. Die SQL-Injection ist in diesem Fall nicht möglich, da die Parameterwerte explizit als Ersatzwerte behandelt werden, anstatt Teil des literalen Anweisungstexts zu werden. Folgendes ist die empfohlene Alternative zur vorherigen Notierung:
// assume the variables "username" and "password"
// contain user-entered data
var sql:String =
"SELECT userId " +
"FROM users " +
"WHERE username = :username " +
" AND password = :password";
var statement:SQLStatement = new SQLStatement();
statement.text = sql;
// set parameter values
statement.parameters[":username"] = username;
statement.parameters[":password"] = password;
|
|
|