Du machst hier ein paar Dinge falsch:
- Sie geben allen Ihren Parametern denselben Namen
@searchitem
. Das wird nicht funktionieren. Die Parameter brauchen eindeutige Namen. - Sie erstellen für jedes Element einen neuen SqlCommand. Das wird nicht funktionieren. Erstellen Sie den SqlCommand einmal am Anfang der Schleife und dann
CommandText
setzen sobald Sie mit der Erstellung der SQL fertig sind. - Ihr SQL endet mit
AND
, was keine gültige Syntax ist.
Verbesserungsvorschläge (nicht per se falsch, aber auch kein Best Practice):
- Wie Frederik vorgeschlagen hat, ist der übliche Weg, den
%
zu setzen Tokens im Parameter, anstatt eine String-Verkettung innerhalb von SQL durchzuführen. - Wenn Sie für Ihre Datenbank nicht ausdrücklich eine Sortierung mit Berücksichtigung der Groß-/Kleinschreibung verwenden, sollte bei Vergleichen die Groß-/Kleinschreibung nicht beachtet werden. Daher brauchen Sie den
LOWER
möglicherweise nicht .
Codebeispiel:
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();