Med SQL-satsparametrar kan du skapa en återanvändbar SQL-sats. När du använder satsparametrar kan värdena inom satsen ändras (till exempel värden som läggs till i en
INSERT
-sats), men den grundläggande satstexten förblir oförändrad. Följaktligen ger det prestandafördelar att använda parametrar och det gör det enklare att koda ett program.
Om satsparametrar
I ett program används ofta en enskild SQL-sats flera gånger, med små variationer. Ta till exempel ett lagerhanteringsprogram där en användare kan lägga till nya lagerartiklar i en databas. En
INSERT
-sats (SQL) som lägger till data i databasen körs med den programkod som används för att lägga till lagerartikeln i databasen. Satsen körs dock med en liten variation varje gång. De faktiska värdena som infogas i tabellen skiljer sig åt eftersom de är specifika för den lagerartikel som läggs till.
Om du har en SQL-sats som används flera gånger med olika värden i satsen, är det bästa sättet att använda en SQL-sats att inkludera parametrar i stället för litteralvärden i SQL-texten. En parameter är en platshållare i satstexten som ersätts med ett faktiskt värde varje gång satsen körs. När du använder parametrar i en SQL-sats skapar du instansen
SQLStatement
som vanligt. Använd parameterplatshållare i stället för litteralvärden i den faktiska SQL-satsen som tilldelas till egenskapen
text
. Sedan definierar du värdet för varje parameter genom att ange ett värde för ett element i SQLStatement-instansens
parameters
-egenskap. Egenskapen
parameters
är en associativ array, vilket innebär att du anger ett visst värde med följande syntax:
statement.parameters[parameter_identifier] = value;
parameter_identifier
är en sträng om du använder en namngiven parameter, eller ett heltalsindex om du använder en namnlös parameter.
Använda namngivna parametrar
En parameter kan vara namngiven eller namnlös. En namngiven parameter har ett specifikt namn som databasen använder för att matcha parametervärdet med platshållarens placering i satstexten. Ett parameternamn består av kolon (:) eller snabel-a (@) följt av ett namn:
:itemName
@firstName
I följande kod visas hur namngivna parametrar används:
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();
Använda namnlösa parametrar
Förutom att använda namngivna parametrar kan du även använda namnlösa parametrar. När du använder en namnlös parameter anger du en parameter i en SQL-sats med hjälp av ett frågetecken (?). Varje parameter tilldelas ett numeriskt index efter parametrarnas ordning i satsen. Den första parametern börjar på index 0. I följande exempel visas en version av det föregående exemplet, men med namnlösa parametrar:
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();
Fördelar med att använda parametrar
Att använda parametrar i en SQL-sats ger dig många fördelar:
-
Bättre prestanda
-
Om du använder parametrar i en SQLStatement-instans blir körningen mer effektiv än om SQL-text skapas dynamiskt vid varje körning. Prestandaförbättringen beror på att satsen förbereds en gång och kan köras flera gånger med olika parametervärden, utan att SQL-satsen behöver kompileras om.
-
Explicit datatypning
-
Parametrar används för att det senare ska gå att skriva in ersättningsvärden som var okända när SQL-satsen skapades. Det enda sättet att säkerställa lagringsklassen för ett värde som har skickats in i databasen är att använda parametrar. Om du inte använder parametrar görs ett försök i körningen att konvertera alla värden från textbeteckningen till en lagringsklass utifrån den associerade kolumnens typtillhörighet.
Mer information om lagringsklasser och kolumntillhörighet finns i
Datatyper som stöds
.
-
Ökad säkerhet
-
Användningen av parametrar ger ett skydd mot så kallade SQL-injektionsangrepp. Vid ett SQL-injektionsangrepp tar sig en användare in i SQL-koden via en plats som är tillgänglig för användare (till exempel ett datainskrivningsfält). Om programkoden konstruerar en SQL-sats genom att direkt sammanfoga användarens indata med SQL-texten, körs användarens inmatade SQL-kod mot databasen. Nedan visas ett exempel på hur användares indata sammanfogas med SQL-texten.
Använd inte den här tekniken
:
// 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;
SQL-injektionsangrepp förhindras om du använder satsparametrar i stället för att sammanfoga de värden användaren har angett i satstext. SQL-injektionen kan inte ske eftersom parametervärdena då uteslutande behandlas som ersättningsvärden i stället för att utgöra en del av den litterala satstexten. Följande alternativ rekommenderas i stället för tidigare beskrivning:
// 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;
|
|
|