Met SQL-instructieparameters kunt u een herbruikbare SQL-instructie creëren. Bij het gebruik van instructieparameters kunnen waarden binnen de instructie wijzigen (zoals waarden die worden toegevoegd aan een instructie van het type
INSERT
) maar blijft de basistekst van de instructie ongewijzigd. Dat betekent dat het gebruik van parameters prestatievoordelen biedt en het coderen van een toepassing gemakkelijker maakt.
Instructieparameters
Een toepassing gebruikt vaak dezelfde SQL-instructie meerdere keren, met slechts een kleine wijziging. Bijvoorbeeld: een voorraadbeheertoepassing waarmee een gebruiker nieuwe voorraaditems kan toevoegen aan de database. De toepassingscode die een voorraaditem toevoegt aan de database voert de SQL-instructie
INSERT
uit, waarmee de gegevens daadwerkelijk worden toegevoegd aan de database. Elke keer dat de instructie wordt uitgevoerd, is er echter een kleine wijziging. Met name de daadwerkelijke waarden die worden ingevoegd in de tabel, verschillen omdat ze specifiek zijn voor het voorraaditem dat wordt toegevoegd.
Als een SQL-instructie meerdere keren maar met verschillende waarden wordt gebruikt, wordt u aangeraden een SQL-instructie te gebruiken die met parameters werkt en niet met literale waarden in de SQL-tekst. Een parameter is een placeholder in de instructietekst die door een daadwerkelijke waarde wordt vervangen elke keer dat de instructie wordt uitgevoerd. Als u parameters in een SQL-instructie wilt gebruiken, maakt u de
SQLStatement
-instantie op de gewone manier. Voor de daadwerkelijke SQL-instructie die aan de eigenschap
text
wordt toegewezen, gebruikt u parameterplaceholders in plaats van literale waarden. Vervolgens definieert u de waarde voor elke parameter door de waarde van een element in de eigenschap
parameters
van de SQLStatement-instantie in te stellen. Aangezien de eigenschap
parameters
een associatieve array is, stelt u een specifieke waarde in met de volgende syntaxis:
statement.parameters[parameter_identifier] = value;
parameter_identifier
is een tekenreeks als u een benoemde parameter gebruikt, of een index van gehele getallen als u een onbenoemde parameter gebruikt.
Benoemde parameters gebruiken
Een parameter kan benoemd zijn. Een benoemde parameter heeft een specifieke naam die door de database wordt gebruikt om de parameterwaarde te koppelen aan de overeenkomstige placeholderlocatie in de instructietekst. De naam van een parameter bestaat uit het teken “:” of “@” gevolgd door een naam, zoals in de volgende voorbeelden wordt geïllustreerd:
:itemName
@firstName
De volgende code illustreert het gebruik van benoemde parameters:
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();
Onbenoemde parameters gebruiken
Als alternatief voor het gebruik van benoemde parameters kunt u ook onbenoemde parameters gebruiken. Als u een onbenoemde parameter wilt gebruiken, geeft u een parameter in een SQL-instructie aan met een “?” (vraagteken). Aan elke parameter wordt een numerieke index toegewezen, afhankelijk van de volgorde van de parameters in de instructie, te beginnen bij index 0 voor de eerste parameter. In het volgende voorbeeld ziet u een variatie van het vorige voorbeeld, nu met onbenoemde parameters:
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();
Voordelen van het gebruik van parameters
Het gebruik van parameters in een SQL-instructie biedt verschillende voordelen:
-
Betere prestaties
-
Een SQLStatement-instantie die parameters gebruikt, kan efficiënter werken dan een instantie die de SQL-tekst dynamisch genereert bij elke uitvoering. De prestatieverbetering is te danken aan het feit dat de instructie één keer wordt voorbereid en vervolgens meerdere keren met verschillende parameterwaarden kan worden uitgevoerd zonder dat de SQL-instructie opnieuw hoeft te worden gecompileerd.
-
Type toewijzen aan expliciete gegevens
-
Parameters worden gebruikt voor het omzetten van waarden in een toegewezen type als de daadwerkelijke waarden niet bekend zijn op het moment dat de SQL-instructie wordt geschreven. Het gebruik van parameters is de enige manier om de opslagklasse te garanderen van een waarde die in de database wordt opgenomen. Als geen parameters worden gebruikt, probeert de runtime alle waarden om te zetten van hun tekstvorm in een opslagklasse op basis van het type van de overeenkomstige kolom.
Zie
Ondersteuning van gegevenstypen
voor meer informatie over opslagklassen en kolomaffiniteit.
-
Betere beveiliging
-
Het gebruik van parameters helpt een schadelijke techniek die SQL-injectieaanval wordt genoemd, onmogelijk te maken. Bij een SQL-injectieaanval voert de gebruiker SQL-code in via een voor de gebruiker toegankelijke locatie (zoals een gegevensinvoerveld). Als toepassingscode een SQL-instructie genereert door gebruikersinvoer rechtstreeks samen te voegen tot SQL-tekst, wordt de door de gebruiker ingevoerde SQL-code uitgevoerd op de database. De volgende code is een voorbeeld van het samenvoegen van gebruikersinvoer tot SQL-tekst.
Gebruik deze techniek niet
:
// 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;
Door instructieparameters in plaats van door de gebruiker ingevoerde waarden samen te voegen tot de tekst voor een instructie, maakt u een SQL-injectieaanval onmogelijk. Er kan geen SQL-injectie plaatsvinden omdat de parameterwaarden expliciet als vervangen waarden worden verwerkt, en niet als waarden die een onderdeel van de literale instructietekst worden. Dit is het aanbevolen alternatief voor de bovenstaande code:
// 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;
|
|
|