2009-03-19 6 views
17

J'essaye de construire SQL pour une requête de paramètre en C# pour une requête qui contiendra la commande LIKE %%.C# construisant la requête de paramètre SQL - LIKE%

Voici ce que je suis en train de acheive (s'il vous plaît noter que la base de données est Firebird)

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

Maintenant, j'ai essayé chaque permutation simple pour obtenir le paramètre à travailler, je l'ai essayé;

  • Ajout du % caractère au paramètre,

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

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

Je ne peux pas sembler que cela fonctionne, comment puis-je utiliser un paramètre pour la requête LIKE pour fonctionner.

Les suggestions sont les bienvenues!

+0

il semble que il y a un code manquant, où vous attribuez le SQL à la commande? Quelle erreur obtenez-vous ou le résultat de la requête ne correspond-il pas à ce que vous attendiez? –

+0

Oui, SQL est affecté au paramètre Cmd.CommandText. –

Répondre

26

Vous ne pouvez pas avoir de paramètres à l'intérieur d'une chaîne de caractères dans la requête. Faire toute la valeur du paramètre, et ajoutez les jokers à la chaîne:

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

un exemple serait? On dirait que vous venez de copier mon code. –

+0

Portez une attention particulière: il a déplacé les jokers au paramètre. Cela fonctionnera, mais c'est la mauvaise façon de le faire. –

+0

@Myhiad: Notez qu'il n'y a que? après l'opérateur like, pas de caractères génériques et pas d'apostrophes. – Guffa

-5

Dans le passé, lorsque je faisais cela, je l'ai simplement intégré dans le SQL, en veillant à remplacer les guillemets simples par des points d'interrogation pour faire face à l'injection SQL. Par exemple:

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

Il serait préférable de remplacer les guillemets simples par deux guillemets simples, afin que les recherches légitimes, y compris les guillemets fonctionnent réellement. 'Remplacer (" '","' '") – Blorgbeard

+2

il expose à des attaques par injection 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

est ce SQL valide pour Firebird? –

+0

Je n'ai pas vu l'exigence de Firebird. J'ai mis à jour le sql pour m'assurer que c'est correct, mais le code de paramètre est faux parce que l'enum SqlDbType était prévu pour Sql Server. J'aime toujours éviter AddWithValue, bien que –

+0

cela ne fonctionne tout simplement pas pour moi. Je reçois l'erreur suivante; FirebirdSql.Data.FirebirdClient.FbException: erreur SQL dynamique évaluation d'expression non prise en charge ----> FirebirdSql.Data.Common.IscException: Exception de type 'FirebirdSql.Data.Common.IscException' a été levée. –

Questions connexes