web-dev-qa-db-fra.com

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

Cela ne fonctionne pas, j'ai aussi essayé ceci:

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? Aucune suggestion?

54
Ngm

Ce que tu veux c'est:

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

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

Sinon, vous recherchez (le premier échantillon) le literal "@SEARCH" (et non la valeur arg), ou vous intégrez des guillemets supplémentaires dans la requête (deuxième échantillon).

D'une certaine manière, il serait peut-être plus facile que TSQL utilise simplement LIKE @SEARCH et le gère chez l'appelant:

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

L'une ou l'autre approche devrait fonctionner.

100
Marc Gravell

À la place 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 + '%');";
2
Ali Almasian

Juste un peu prudent avec une légère différence entre Add et AddWithValue method. J'ai eu le problème ci-dessous, quand j'ai utilisé la méthode Add et mis le mauvais paramètre SqlType .

  • ncharetnvarcharpeut stocker Unicode caractères.
  • charetvarchar ne peut pas stocker de caractères Unicode .

Par exemple:

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

Lorsque j'ai changé le SqlType en NVarChar , les deux méthodes ont bien fonctionné pour moi.

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
LeoFraietta