Je doet hier een paar dingen verkeerd:
- Je geeft al je parameters dezelfde naam
@searchitem
. Dat zal niet werken. De parameters hebben unieke namen nodig. - Je maakt een nieuwe SqlCommand voor elk item. Dat zal niet werken. Maak de SqlCommand eenmaal aan het begin van de lus en stel vervolgens
CommandText
in als je klaar bent met het maken van de SQL. - Uw SQL eindigt op
AND
, wat geen geldige syntaxis is.
Suggesties voor verbetering (niet per se verkeerd, maar ook niet best practice):
- Zoals Frederik suggereerde, is de gebruikelijke manier om de
%
tokens in de parameter, in plaats van stringconcatenatie binnen de SQL uit te voeren. - Tenzij u expliciet een hoofdlettergevoelige sortering voor uw database gebruikt, moeten vergelijkingen hoofdletterongevoelig zijn. Het is dus mogelijk dat u de
LOWER
. niet nodig heeft .
Codevoorbeeld:
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();