Почему мы делаем 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.)