Использование SqlParameter в предложении SQL LIKE не работает - PullRequest
59 голосов
/ 20 марта 2009

У меня есть следующий код:

const string Sql = 
    @"select distinct [name] 
      from tblCustomers 
      left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId  
      where (tblCustomer.Name LIKE '%@SEARCH%' OR tblCustomerInfo.Info LIKE '%@SEARCH%');";

using (var command = new SqlCommand(Sql, Connection))
{       
    command.Parameters.AddWithValue("@SEARCH", searchString);
    ...
}

Это не работает, я тоже пробовал:

const string Sql = 
    @"select distinct [name] 
     from tblCustomers 
     left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId  
     where (tblCustomer.Name LIKE @SEARCH OR tblCustomerInfo.Info LIKE @SEARCH );";

using (var command = new SqlCommand(Sql, Connection))
{       
    command.Parameters.AddWithValue("@SEARCH", "'%" + searchString + "%'");
    ...
}

но это тоже не работает. Что не так? Есть предложения?

Ответы [ 4 ]

112 голосов
/ 20 марта 2009

То, что вы хотите:

tblCustomerInfo.Info LIKE '%' + @SEARCH + '%'

(или отредактируйте значение параметра, указав в первую очередь%).

В противном случае вы либо (первый пример) ищете литерал"@SEARCH" (не значение arg), либо встраиваете некоторые дополнительные кавычки в запрос (второй пример).

В некоторых случаях может быть проще, если TSQL просто использует LIKE @SEARCH и обрабатывает его у вызывающей стороны:

command.Parameters.AddWithValue("@SEARCH","%" + searchString + "%");

Любой подход должен работать.

2 голосов
/ 10 сентября 2016

Вместо использования:

const string Sql = 
@"select distinct [name] 
  from tblCustomers 
  left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId  
  where (tblCustomer.Name LIKE '%@SEARCH%' OR tblCustomerInfo.Info LIKE '%@SEARCH%');";

Используйте этот код:

const string Sql = 
@"select distinct [name] 
  from tblCustomers 
  left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId  
  where (tblCustomer.Name LIKE '%' + @SEARCH + '%' OR tblCustomerInfo.Info LIKE '%' + @SEARCH + '%');";
0 голосов
/ 31 января 2019

Немного осторожно с небольшой разницей между Add и AddWithValue методами. У меня была проблема ниже, когда я использовал Add метод и поставил неправильный параметр SqlType .

  • nchar и nvarchar может хранить Unicode символов.
  • char и varchar не могут хранить Unicode символов.

Например:

string query = " ... WHERE stLogin LIKE @LOGIN ";

SqlParameter p = new SqlParameter("@LOGIN", SqlDbType.Char, 255) 
{ 
    Value = "%" + login + "%" 
};

command.Parameters.AddWithValue(p.ParameterName, p.Value); //works fine!!!

command.Parameters.Add(p); // won't work

Когда я изменил SqlType на NVarChar , оба метода работали нормально для меня.

SqlParameter p = new SqlParameter("@LOGIN", SqlDbType.NVarChar, 255) 
{ 
    Value = "%" + login + "%" 
};

command.Parameters.AddWithValue(p.ParameterName, p.Value); //worked fine!!!

command.Parameters.Add(p); //worked fine!!!
0 голосов
/ 20 марта 2009

Вы можете сделать LIKE @SEARCH и в своем коде C # сделать

searchString = "%" + searchString + "%"
...