2009-03-20 10 views
48

Ich habe den folgenden Code:Verwendung von SqlParameter in SQL LIKE-Klausel nicht funktioniert

const string Sql = 
    @"select distinct [name] 
     from tblCustomers 
     left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId 
     where (tblCustomer.Name LIKE '%@SEARCH%' OR tblCustomerInfo.Info LIKE '%@SEARCH%');"; 

using (var command = new SqlCommand(Sql, Connection)) 
{  
    command.Parameters.AddWithValue("@SEARCH", searchString); 
    ... 
} 

dies nicht funktioniert, habe ich versucht, dies auch:

const string Sql = 
    @"select distinct [name] 
    from tblCustomers 
    left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId 
    where (tblCustomer.Name LIKE @SEARCH OR tblCustomerInfo.Info LIKE @SEARCH);"; 

using (var command = new SqlCommand(Sql, Connection)) 
{  
    command.Parameters.AddWithValue("@SEARCH", "'%" + searchString + "%'"); 
    ... 
} 

aber auch nicht funktioniert . Was läuft falsch? Irgendwelche Vorschläge?

Antwort

85

Was Sie wollen, ist:

tblCustomerInfo.Info LIKE '%' + @SEARCH + '%' 

(oder den Parameterwert bearbeiten, um das% an erster Stelle enthalten).

Ansonsten suchen Sie entweder (erstes Beispiel) nach dem Literal "@SEARCH" (nicht den arg-Wert), oder Sie fügen einige zusätzliche Anführungszeichen in die Abfrage ein (zweites Beispiel).

In gewisser Weise könnte es einfacher sein die TSQL nur LIKE @SEARCH verwenden zu haben, und behandeln es bei dem Anrufer:

command.Parameters.AddWithValue("@SEARCH","%" + searchString + "%"); 

Beide Ansätze funktionieren sollte.

+0

command.Parameters.AddWithValue (“ @SEARCH ","% "+ Suchstring +"% "); Arbeitete, die zusätzlichen einfachen Anführungszeichen waren das Problem, wie von Ihnen hingewiesen – Ngm

+1

Doing es der zweite Weg sieht besser für mich, weil die endgültige Aussage wird in der Tat ordentlich aussehen. – Javid

+8

Dies funktioniert nicht korrekt, wenn der Suchstring die Zeichen '%' '_' oder '[' enthält, vorausgesetzt, Sie möchten nach einem dieser Zeichenliterale suchen. Für eine 100% ige Lösung müssen Sie diese Zeichen in die Suchzeichenfolge in Klammern '[]' einfügen. Der C# -Code 'Regex.Replace (searchString, @" ([% _ \ []) ", @" [$ 1] ") macht den Trick. –

-1

Sie könnten LIKE @SEARCH tun und in C# -Code, tun

searchString = "%" + searchString + "%" 
+4

würde dies nicht eine Chance für SQL-Injektion offenlegen? –

+0

Ja würde es. Oder, wahrscheinlicher, jemand wird nach einer Zeichenkette suchen, die ein Zeichen enthält, und es wird explodieren. Mach das nicht. – Taran

3

Statt mit:

const string Sql = 
@"select distinct [name] 
    from tblCustomers 
    left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId 
    where (tblCustomer.Name LIKE '%@SEARCH%' OR tblCustomerInfo.Info LIKE '%@SEARCH%');"; 

Verwenden Sie diesen Code:

const string Sql = 
@"select distinct [name] 
    from tblCustomers 
    left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId 
    where (tblCustomer.Name LIKE '%' + @SEARCH + '%' OR tblCustomerInfo.Info LIKE '%' + @SEARCH + '%');"; 
+0

Das macht für mich keinen Sinn, aber es funktioniert. Können Sie erklären warum? – Timothy

Verwandte Themen