Подтвердить что ты не робот

Как использовать подстановочные знаки в 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'. Итак, как вы правильно форматируете подстановочные знаки для включения в параметры запроса? Любая помощь приветствуется!

4b9b3361

Ответ 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));