Почему мы делаем SQLiteCommand, Parameters.add, в то время как мы можем использовать string.Format, чтобы составить выражение sql?
Я видел во многих учебниках, которые составляют оператор sql с помощью переменных и Parameters.Add likt this
public void updateStudent(String @studentID, String @firstName, String @lastName)
{
SQLiteCommand command = conn.CreateCommand();
command.CommandText = "UPDATE Students SET firstName = @firstName, lastName = @lastName WHERE studentID = @studentID";
command.Parameters.Add(new SQLiteParameter("@studentID", @studentID));
command.Parameters.Add(new SQLiteParameter("@firstName", @firstName));
command.Parameters.Add(new SQLiteParameter("@lastName" , @lastName));
command.ExecuteNonQuery();
}
почему мы не используем
string.Format("Update Students SET firstName = '{0}', lastName = '{1}...", @firstName, @lastname)
любая выгода?
Ответы
Ответ 1
Четыре причины:
- Предотвращение атак SQL-инъекций
- Предотвращение проблем со строками, содержащими подлинные апострофы, без намерения вызвать атаку SQL-инъекций (например, фамилию "O'Reilly"
- Избегайте ненужных преобразований строк, которые могут вызвать сбои по культурным причинам (например, разница между "1.23" и "1,23" в зависимости от вашей культуры.
- Сохранение кода (SQL) и данных (параметров) для более удобной читаемости
Также обратите внимание:
- Это не спецификация SQLite. Это наилучшая практика для всех баз данных.
-
Вам не нужно использовать @
в качестве префикса для своих переменных, если они не являются ключевыми словами. Поэтому было бы более идиоматично писать:
command.Parameters.Add(new SQLiteParameter("@lastName", lastName));
(Ditto для объявлений параметров метода, начинающихся с... но не параметров
внутри оператора SQL.)