2010-09-24 6 views
12

Dans le cadre d'un effort pour arrêter d'utiliser la génération SQL dynamique et encourager l'utilisation de variables de liaison, je rencontre des problèmes.Utilisation de variables de liaison Oracle avec LIKE en C#

Je suis Interrogation une base de données Oracle 9i à partir d'une page ASP.NET à l'aide des fournisseurs de données Oracle pour .NET

La requête est

sql = "SELECT somedata FROM sometable WHERE machine = :machineName "; 

I définir le paramètre Oracle comme suit

OracleParameter parameter = new OracleParameter(); 
parameter.ParameterName = "machineName"; 
parameter.OracleDbType = OracleDbType.Varchar2; 
parameter.Value = machine; //machine is a variable of type string 
parameterList.Add(parameter); 

Cela fonctionne très bien pour l'opérateur "=". Mais je n'arrive pas à le faire fonctionner avec "LIKE". Je ne sais pas comment formater la requête afin qu'elle accepte l'utilisation du caractère générique "%".

J'ai essayé:

sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName% "; 
sql = "SELECT somedata FROM sometable WHERE machine LIKE ':machineName%' "; 
sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName||% "; 

et aussi:

parameter.Value = machine+'%'; 

mais tout ce que je reçois sont ORA-00911 (caractère illégal) et ORA-01036 (nom illégal/valeur) des exceptions.

Qu'est-ce que je fais mal?

+0

Dupliquer de cette question: http://stackoverflow.com/questions/1412023/constructing-a-good-search-query-using-system-data-oracleclient – CodingGorilla

Répondre

24

Essayez:

sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName || '%' "; 

En raison de la variable BIND, il n'y aurait pas besoin d'être des guillemets simples autour d'elle. Mais le% ne l'est pas, donc je m'attendrais à ce qu'il soit encapsulé.

+0

Vous, monsieur, avez raison. C'était en effet la dernière option, celle qui me manquait. Je vous remercie! –

+0

Merci beaucoup pour cette réponse! Je travaille sur un projet de noeud avec un pilote de base de données Oracle et rencontrais le même problème. Juste par curiosité, pourquoi ai-je besoin des deux tuyaux (||) avant l'opérateur générique (%)? –

+2

@DaveCooper le || concatène le '%', c'est une commande pour la concaténation. –