2009-03-19 18 views
17

Estoy intentando construir SQL para una consulta de parámetro en C# para una consulta que contendrá el comando LIKE %%.consulta de parámetro de construcción C# SQL - LIKE%

Esto es lo que estoy tratando de acheive (tenga en cuenta que la base de datos Firebird es)

var SQL = string.format("SELECT * FROM {0} WHERE {1} LIKE '%?%'", TABLE, NAME); 
cmd.Parameters.AddWithValue(NAME, "JOHN"); 

Ahora me han tratado todos y cada uno de permutación para obtener el parámetro a trabajar, he tratado;

  • Añadiendo el carácter % al parámetro,

    cmd.Parameters.AddWithValue(NAME, "%" + "JOHN" + "%"); 
    
  • o

    cmd.Parameters.AddWithValue(NAME, "'%" + "JOHN" + "%'"); 
    

Me parece que no puede conseguir que esto funcione, ¿cómo puedo usar un parámetro para la consulta LIKE para trabajar.

¡Sugerencias son bienvenidas!

+0

parece que no hay un código que falta, en donde se le asigna el SQL para el comando? ¿Qué error está recibiendo o el resultado de la consulta no es el que esperaba? –

+0

sí, SQL se está asignando al parámetro Cmd.CommandText. –

Respuesta

26

No puede haber parámetros dentro de una cadena literal en la consulta. Hacer que todo el valor del parámetro, y añadir los comodines para la cadena:

var SQL = string.format("SELECT * FROM {0} WHERE {1} LIKE ?", TABLE, NAME); 
Cmd.Parameters.AddWithValue(NAME, "%" + "JOHN" + "%"); 
+0

sería un ejemplo? parece que acabas de copiar mi código. –

+0

Preste atención: movió las comodines al parámetro. Esto funcionará, pero no es la forma incorrecta de hacerlo. –

+0

@Myhiad: ¿Tenga en cuenta que solo hay? después del operador like, no hay caracteres comodín ni apóstrofes. – Guffa

-5

En el pasado al hacer esto, simplemente lo he integrado en el sql, asegurándome de reemplazar las comillas simples con signos de interrogación para tratar con la inyección sql. Por ejemplo:

var SQL = string.format("SELECT * FROM {0} WHERE {1} LIKE '%{2}%'", 
    TABLE, 
    NAME, 
    JOHN.Replace("'","?")); 
+1

Sería mejor reemplazar las comillas simples con dos comillas simples, de modo que las búsquedas legítimas, incluidas las comillas, realmente funcionen. 'Reemplazar (" '","' '")' – Blorgbeard

+2

expone a los ataques de inyección sql – Ricibald

4
var SQL = string.Format("SELECT * FROM {0} WHERE {1} LIKE '%' + ? + '%'", TABLE, NAME); 
Cmd.CommandText = SQL; 
Cmd.Parameters.Add("?", SqlDbType.VarChar, 50).Value = "JOHN"; 
+0

es este SQL válido para Firebird? –

+0

No vi el requisito de Firebird. Actualicé el sql para asegurarme de que está bien, pero el código del parámetro es incorrecto porque el enum SqlDbType estaba destinado al servidor Sql. Todavía me gusta evitar AddWithValue, aunque –

+0

esto simplemente no funciona para mí. Estoy teniendo el siguiente error; FirebirdSql.Data.FirebirdClient.FbException: Error SQL dinámico evaluación de la expresión no es compatible ----> FirebirdSql.Data.Common.IscException: excepción de tipo 'FirebirdSql.Data.Common.IscException' fue lanzado. –

Cuestiones relacionadas