Du gør et par ting forkert her:
- Du giver alle dine parametre det samme navn
@searchitem
. Det vil ikke virke. Parametrene skal have unikke navne. - Du opretter en ny SqlCommand for hvert element. Det vil ikke virke. Opret SqlCommand en gang i begyndelsen af løkken, og indstil derefter
CommandText
når du er færdig med at oprette SQL. - Din SQL ender med
AND
, som ikke er gyldig syntaks.
Forslag til forbedringer (ikke forkert i sig selv, men heller ikke bedste praksis):
- Som Frederik foreslog, er den sædvanlige måde at sætte
%
tokens i parameteren, i stedet for at lave strengsammenkædning inde i SQL. - Medmindre du udtrykkeligt bruger en versalfølsom sortering til din database, bør sammenligninger være ufølsomme for store og små bogstaver. Derfor har du muligvis ikke brug for
LOWER
.
Kodeeksempel:
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();