Как использовать подстановочные знаки в SQL-запросе с параметрами
Скажем, у меня есть базовый запрос, примерно такой:
SELECT holiday_name
FROM holiday
WHERE holiday_name LIKE %Hallow%
Это отлично работает в моей панели запросов sql и возвращает "Хэллоуин". Моя проблема возникает, когда я пытаюсь использовать параметры с символами "%" в моем коде.
SqlConnection Connection = null;
SqlCommand Command = null;
string ConnectionString = ConfigurationManager.ConnectionStrings["SQLdb"].ConnectionString;
string CommandText = "SELECT holiday_name "
+ "FROM holiday "
+ "WHERE holiday_name LIKE %@name%";
Connection = new SqlConnection(ConnectionString);
try
{
Connection.Open();
Command = new SqlCommand(CommandText, Connection);
Command.Parameters.Add(new SqlParameter("name", HolidayTextBox.Text));
var results = Command.ExecuteScalar();
}
catch (Exception ex)
{
//error stuff here
}
finally
{
Command.Dispose();
Connection.Close();
}
Это вызывает неправильную синтаксическую ошибку. Я пробовал переместить "%" в свой параметр так:
Command.Parameters.Add(new SqlParameter("%name%", HolidayTextBox.Text));
но затем я получаю сообщение об ошибке: я не объявлял скалярную переменную '@name'. Итак, как вы правильно форматируете подстановочные знаки для включения в параметры запроса? Любая помощь приветствуется!
Ответы
Ответ 1
Во-первых, ваше имя SqlParameter
@name
not name
.
Во-вторых, я бы переместил ваши подстановочные знаки.
Итак, это будет выглядеть так:
string CommandText = "SELECT holiday_name "
+ "FROM holiday "
+ "WHERE holiday_name LIKE @name;"
Connection = new SqlConnection(ConnectionString);
try
{
var escapedForLike = HolidatyTextBox.Text; // see note below how to construct
string searchTerm = string.Format("%{0}%", escapedForLike);
Connection.Open();
Command = new SqlCommand(CommandText, Connection);
Command.Parameters.Add(new SqlParameter("@name", searchTerm));
var results = Command.ExecuteScalar();
}
Обратите внимание, что LIKE
требует особой осторожности при передаче параметров, и вам нужно избежать некоторых символов Экранирование специальных символов в инструкции SQL LIKE с использованием параметров sql.
Ответ 2
что бы вы ни делали , не делайте этого:
string CommandText = "SELECT holiday_name "
+ "FROM holiday "
+ "WHERE holiday_name LIKE '%'" + HolidayTextBox.Text + "'%'";
так как это откроет вам до sql-инъекции, вместо этого сделайте следующее:
Command.Parameters.Add(new SqlParameter("@name", "%" + HolidayTextBox.Text + "%"));
вам может понравиться знать о Command.Parameters.AddWithValue, например:
Command.Parameters.AddWithValue("@name", "%" + HolidayTextBox.Text + "%");
Ответ 3
%
должен быть частью строки поиска, а не запроса.
string CommandText = "SELECT holiday_name "
+ "FROM holiday "
+ "WHERE holiday_name LIKE @name";
Connection = new SqlConnection(ConnectionString);
try
{
Connection.Open();
Command = new SqlCommand(CommandText, Connection);
string name = "%" + HolidayTextBox.Text + "%";
Command.Parameters.Add(new SqlParameter("@name", name));