97 votes

L'utilisation de SqlParameter dans la clause SQL LIKE ne fonctionne pas

J'ai le code suivant :

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);
    ...
}

Ça ne marche pas, j'ai essayé ça aussi :

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 + "%'");
    ...
}

mais cela ne fonctionne pas aussi bien. Qu'est-ce qui ne va pas ?

201voto

Marc Gravell Points 482669

Ce que vous voulez :

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

(ou modifiez la valeur du paramètre pour inclure le % en premier lieu).

Sinon, vous recherchez soit (premier échantillon) le littéral "@SEARCH" (pas la valeur arg), soit vous incorporez des citations supplémentaires dans la requête (deuxième échantillon).

D'une certaine manière, il pourrait être plus facile d'avoir le TSQL juste utiliser LIKE @SEARCH, et de le gérer à l'appelant :

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

L'une ou l'autre approche devrait fonctionner.

10voto

Ali Almasian Points 119

Au lieu d'utiliser :

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%');";

Utilisez ce code :

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 + '%');";

-7voto

Charles Graham Points 8132

Vous pourriez faire LIKE @SEARCH et dans votre code C#, faire

searchString = "%" + searchString + "%"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X