2010-04-07 12 views
8

Estoy haciendo una consulta muy simple en ASP.NET, pero después de insertar la cláusula LIKE deja de funcionar.cómo obtener la cláusula LIKE para trabajar en ADO.NET y SQL Server

Ejemplo:

String sql = " SELECT * 
       FROM Products 
       WHERE ID = @MYID 
        AND Name LIKE '%@MYNAME%' "; 
SqlCommand command = new SqlCommand(sql, cn); 


command.Parameters.AddWithValue("@MYID", MYID.Text); 

command.Parameters.AddWithValue("@MYNAME", MYNAME.Text); 

Si me quita similares funciona. Por lo tanto, estoy pensando que tiene que ver con las '' citas?

+0

lo siento, tuve que editar la pregunta. devolvió 0 resultado a pesar de que en @MYNAME proporcioné la cadena parcial correcta – noobplusplus

Respuesta

-12

la instrucción SQL debería tener este aspecto:

String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE '%' + @MYNAME + '%'"; 

No estoy seguro de haber entendido su comentario completo, pero parece que desea utilizar el valor de un cuadro de texto en su consulta - tal vez esto es lo Está intentando hacer:

String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE '%' + text_box.Text + '%'"; 

"text_box" sería la identificación real de su control de cuadro de texto.

+0

que no funcionó :(Lo probé e imprimí el sql ver a continuación: Y NOMBRE COMO '% System.Web.UI.WebControls.TextBox % ' – noobplusplus

+15

-1 para vulnerabilidad de inyección SQL – Aaronaught

+2

La concatenación de valores de cadenas SQL es INCORRECTA (incluso si funciona): mal rendimiento debido a la no reutilización del plan de consulta, riesgo de inyección de SQL, como ya se dijo. –

0

O

String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE @MYNAME "; 

y cuando se establece el parámetro @MYNAME, añadir los caracteres "%" adecuadamente (% SMITH%). No creo que necesite las comillas simples cuando se trata de parámetros.

1

Solo una nota para decir que el uso de LIKE con un comodín inicial casi siempre es una muy mala idea , porque la consulta no usará ningún índice en esa columna. En este caso, probablemente pueda salirse con la suya porque parece que el filtro en la columna ID lo limitará a un registro, pero generalmente lo que necesita hacer es poner un índice de texto completo en la columna de nombre y escribir la consulta como esto:

... WHERE CONTAINS(name, @MyName) 
+0

Verdadero siempre que el texto La búsqueda es una palabra (o palabras) completa o el comienzo de una palabra. Si está buscando texto en el medio o al final de una palabra, desafortunadamente todavía necesita usar 'LIKE% s%' – Aaronaught

26

El código original confunde el texto de la instrucción SQL con el contenido del parámetro. Su código en realidad debería tener este aspecto:

string sql = "SELECT * 
       FROM Products 
       WHERE ID = @MyID 
       AND Name LIKE @MyName"; 
using (SqlCommand command = new SqlCommand(sql, cn)) 
{ 
    command.Parameters.AddWithValue("@MyID", MyID.Text); 
    command.Parameters.AddWithValue("@MyName", "%" + MyName.Text + "%"); 
    // Etc. 
} 

Los % señales tienen que ser parte del valor del parámetro, y usted no necesita las comillas simples en absoluto al utilizar parámetros de unión.

+1

Esto no funcionará correctamente cuando MyName.El texto contiene los caracteres% _ o [, suponiendo que realmente desea buscar uno de esos literales de caracteres. Para una solución al 100%, debe envolver esos caracteres entre corchetes []. El código de C# 'Regex.Replace (searchString, @" ([% _ \ []) ", @" [$ 1] ") hace el truco. Gracias a Matt Miller por señalar esto [aquí] (http://stackoverflow.com/questions/665129/use-of-sqlparameter-in-sql-like-clause-not-working). – Dejan

-1

se echa en falta el signo % al pasar el valor del parámetro

command.Parameters.AddWithValue("@MYNAME"+"%", MYNAME.Text); 
+0

No es correcto, el nombre del parámetro no tiene relación con el patrón LIKE. Eso debería ser un aplicado al valor del parámetro. – Lankymart

0

No creo que el uso de un parámetro de enlace es como la inserción de su valor en la cadena SQL! Los valores de los parámetros de enlace se envían como datos separados a la base de datos, por lo que no deben estar entre comillas, y tampoco pueden contener ningún código SQL opcional, nombres de tabla o columna.

Cuestiones relacionadas