2010-09-24 10 views
12

Als Teil der Bemühungen, die dynamische SQL-Generierung zu beenden und die Verwendung von Bindevariablen zu fördern, stößt ich auf einige Probleme.Verwendung von Oracle-Bindungsvariablen mit LIKE in C#

ich eine Oracle 9i-Datenbank für .NET

Die Abfrage von einer ASP.NET-Seite mit Oracle Data Provider bin Abfrage ist

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

ich die Oracle-Parameter definieren als

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

Dies funktioniert gut für "=" Operator. Aber ich kann es einfach nicht mit "LIKE" funktionieren lassen. Ich weiß nicht, wie man die Abfrage so formatiert, dass sie die Verwendung des Platzhalters "%" akzeptiert.

Ich habe versucht:

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

und auch:

parameter.Value = machine+'%'; 

aber alles, was ich bekommen sind ORA-00911 (unzulässiges Zeichen) und ORA-01036 (illegal Name/Wert) Ausnahmen.

Was mache ich falsch?

+0

Duplizieren Sie diese Frage: http://stackoverflow.com/questions/1412023/constructing-a-good-search-query-using-system-data-oracleclient – CodingGorilla

Antwort

24

Versuchen:

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

Wegen des BIND-Variable, gäbe es nicht einfache Anführungszeichen um es sein muß. Aber das% ist nicht, also würde ich erwarten, dass es gekapselt werden muss.

+0

Sie, Sir, haben Recht. Das war in der Tat die letzte Option, die ich vermisste. Vielen Dank! –

+0

Vielen Dank für diese Antwort! Ich arbeite an einem Knoten-Projekt mit einem Oracle-Datenbanktreiber und hatte das gleiche Problem. Nur aus Neugier, warum brauche ich die beiden Pipes (||) vor dem Wildcard-Operator (%)? –

+2

@DaveCooper die || verkettet das '%', es ist ein Befehl für die Verkettung. –