2009-03-20 10 views
48

he el siguiente código:El uso de SqlParameter en la cláusula LIKE de SQL no funciona

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

Esto no funciona, he intentado esto así:

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

pero esto no funciona tan bien . ¿Qué está pasando mal? ¿Alguna sugerencia?

Respuesta

85

Lo que queremos es:

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

(o editar el valor del parámetro para incluir el% en el primer lugar).

De lo contrario, son o bien (primera muestra) en busca de la literal "@SEARCH" (no el arg-valor), o que ha incrustado algunas citas adicionales en la consulta (segunda muestra).

En cierto modo, podría ser más fácil tener la TSQL sólo tiene que utilizar LIKE @SEARCH, y manejarlo a la persona que llama:

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

Cualquiera de los enfoques debería funcionar.

+0

command.Parameters.AddWithValue (" @SEARCH ","% "+ searchString +"% "); Funcionó, las comillas simples adicionales fueron el problema señalado por usted – Ngm

+1

Hacerlo de la segunda manera me parece mejor porque la declaración final se verá realmente ordenada. – Javid

+8

Esto no funcionará correctamente cuando searchString contenga los caracteres '%' '_' o' [', suponiendo que realmente desea buscar uno de esos literales de caracteres. Para una solución al 100%, debe envolver esos caracteres en el searchString entre paréntesis '[]'. El código de C# 'Regex.Replace (searchString, @" ([% _ \ []) ", @" [$ 1] ") hace el truco. –

-1

Usted podría hacer LIKE @SEARCH y en su código C#, haga

searchString = "%" + searchString + "%" 
+4

¿esto no expondría una oportunidad para la inyección sql? –

+0

Sí, lo haría. O, posiblemente más probable, alguien va a buscar una cadena que incluya un 'personaje y explotará. No hagas esto. – Taran

3

En lugar de utilizar:

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

Usar este código:

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

Esto no tiene ningún sentido para mí, pero funciona. ¿Podrías explicar por qué? – Timothy

Cuestiones relacionadas