wake-up-neo.com

Verwendung von SqlParameter in der SQL-LIKE-Klausel funktioniert nicht

Ich habe folgenden 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%');";

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

Das funktioniert nicht, ich habe es auch versucht:

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 + "%'");
    ...
}

das funktioniert aber auch nicht so gut. Was läuft schief? Irgendwelche Vorschläge?

54
Ngm

Was du willst ist:

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

(oder bearbeiten Sie den Parameterwert so, dass er% enthält).

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

In gewisser Weise ist es vielleicht einfacher, wenn TSQL nur LIKE @SEARCH verwendet und beim Aufrufer behandelt wird:

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

Jeder Ansatz sollte funktionieren.

100
Marc Gravell

Anstelle von:

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 + '%');";
2
Ali Almasian

Nur ein wenig vorsichtig mit einem kleinen Unterschied zwischen den Methoden Add und AddWithValue. Ich hatte das Problem unten, als ich die Add -Methode verwendete und den falschen SqlType -Parameter einlegte.

  • nchar und nvarchar können Unicode Zeichen speichern.
  • char und varcharkann kein Unicode speichern Zeichen.

Zum Beispiel:

string query = " ... WHERE stLogin LIKE @LOGIN ";

SqlParameter p = new SqlParameter("@LOGIN", SqlDbType.Char, 255) 
{ 
    Value = "%" + login + "%" 
};

command.Parameters.AddWithValue(p.ParameterName, p.Value); //works fine!!!

command.Parameters.Add(p); // won't work

Wenn ich SqlType in NVarChar änderte, funktionierten die beiden Methoden gut für mich.

SqlParameter p = new SqlParameter("@LOGIN", SqlDbType.NVarChar, 255) 
{ 
    Value = "%" + login + "%" 
};

command.Parameters.AddWithValue(p.ParameterName, p.Value); //worked fine!!!

command.Parameters.Add(p); //worked fine!!!
0
LeoFraietta