Использование параметров инструкции SQL позволяет создать инструкцию SQL для неоднократного использования. При использовании параметров инструкций значения в инструкциях могут меняться (например, значения, вставленные в инструкцию
INSERT
), но основной текст инструкции остается неизменным. Следовательно, использование параметров улучшает производительность и упрощает кодирование приложения.
Основные сведения о параметрах инструкций
Часто приложение использует одну и ту же инструкцию SQL несколько раз с незначительными изменениями. Рассмотрим приложение для инвентаризации, работая в котором пользователь может добавить новые предметы хранения в базу данных. Код приложения, который добавляет предмет хранения в базу данных, выполняет инструкцию SQL
INSERT
, которая добавляет данные в базу данных. Однако каждый раз инструкция выполняется с некоторыми изменениями. Вставляемые в таблицу значения отличаются, так как они соответствуют конкретному добавляемому предмету хранения.
В случаях с инструкцией SQL, которая используется несколько раз с различными значениями, рекомендуется использовать инструкцию SQL, текст которой содержит параметры, а не литеральные значения. Параметр представляет собой заполнитель в тексте инструкции, который заменяется фактическим значением при каждом выполнении инструкции. Для использования параметров в инструкции SQL необходимо, как обычно, создать экземпляр
SQLStatement
. В инструкции SQL, присвоенной свойству
text
, используйте заполнители для параметров вместо литеральных значений. Затем определите значение каждого параметра, задав значение элемента в свойстве
parameters
экземпляра SQLStatement. Свойство
parameters
представляет собой ассоциативный массив, поэтому конкретное значение задается с использованием следующего синтаксиса:
statement.parameters[parameter_identifier] = value;
Элемент
parameter_identifier
является строкой, если используется именованный параметр, или целочисленным индексом, если используется неименованный параметр.
Использование именованных параметров
Параметр может быть именованным. Именованный параметр имеет определенное имя, используемое базой данных для поиска соответствия между значением параметра и позицией заполнителя в тексте инструкции. Имя параметра состоит из символа «:» или «@», за которым следует имя, как в следующих примерах:
:itemName
@firstName
Следующий код иллюстрирует использование именованных параметров:
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();
Использование неименованных параметров
Вместо именованных можно также использовать неименованные параметры. Неименованный параметр обозначается в инструкции SQL символом «?». Каждому параметру присваивается числовой индекс в соответствии с порядком следования параметров в инструкции, начиная с индекса 0 для первого параметра. Следующий пример является вариантом предыдущего примера с использованием неименованных параметров:
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();
Преимущества использования параметров
Использование параметров в инструкции SQL имеет несколько преимуществ:
-
Лучшая производительность
-
Экземпляр SQLStatement, использующий параметры, работает более эффективно по сравнению с экземпляром, динамически создающим текст SQL при каждом выполнении. Производительность улучшается потому, что инструкция создается один раз и может использоваться многократно с различными значениями параметров без необходимости повторной компиляции инструкции SQL.
-
Явный ввод данных
-
Параметры позволяют вводить подстановочные значения, которые неизвестны в момент построения инструкции SQL. Использование параметров является единственной гарантией создания класса хранилища значений, передаваемых в базу данных. Если параметры не используются, среда выполнения пытается преобразовать все значения из текстовых в класс хранилища на основе родственности типа соответствующего столбца.
Дополнительные сведения о классах хранилища и родственных столбцах см. в разделе «
Поддержка типов данных
».
-
Лучшая безопасность
-
Использование параметров позволяет предотвратить зловредные атаки с внедрением SQL. При атаке с внедрением SQL пользователь вводит код SQL в местоположение, доступное для пользователя (например, в поле ввода данных). Если код приложения создаст инструкцию SQL, вставив введенные пользователем данные непосредственно в текст SQL, введенный пользователем код SQL выполняется в отношении базы данных. Следующий пример иллюстрирует вставку введенных пользователем данных в текст SQL.
Не используйте этот метод
:
// 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. Внедрение SQL не может произойти, так как значения параметров воспринимаются как подстановочные значения, а не как часть литерального текста инструкции. Далее приводится рекомендуемая альтернатива предыдущему примеру:
// 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;
|
|
|