Stai sbagliando alcune cose qui:
- Dai a tutti i tuoi parametri lo stesso nome
@searchitem
. Non funzionerà. I parametri necessitano di nomi univoci. - Crea un nuovo SqlCommand per ogni elemento. Non funzionerà. Crea SqlCommand una volta all'inizio del ciclo e poi imposta
CommandText
una volta terminata la creazione dell'SQL. - Il tuo SQL termina con
AND
, che non è una sintassi valida.
Suggerimenti di miglioramento (non sbagliati di per sé, ma nemmeno best practice):
- Come suggerito da Frederik, il solito modo è mettere il
%
token nel parametro, anziché eseguire la concatenazione di stringhe all'interno dell'SQL. - A meno che tu non utilizzi esplicitamente regole di confronto con distinzione tra maiuscole e minuscole per il tuo database, i confronti dovrebbero essere senza distinzione tra maiuscole e minuscole. Pertanto, potresti non aver bisogno del
LOWER
.
Esempio di codice:
SqlCommand cmd = new SqlCommand();
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.Append("SELECT name, memberid FROM members ");
var i = 1;
foreach (string item in keywords)
{
sqlBuilder.Append(i == 1 ? " WHERE " : " AND ");
var paramName = "@searchitem" + i.ToString();
sqlBuilder.AppendFormat(" Name LIKE {0} ", paramName);
cmd.Parameters.AddWithValue(paramName, "%" + item + "%");
i++;
}
cmd.CommandText = sqlBuilder.ToString();