Du gör några saker fel här:
- Du ger alla dina parametrar samma namn
@searchitem
. Det kommer inte att fungera. Parametrarna behöver unika namn. - Du skapar ett nytt SqlCommand för varje objekt. Det kommer inte att fungera. Skapa SqlCommand en gång i början av loopen och ställ sedan in
CommandText
när du är klar med att skapa SQL. - Din SQL slutar med
AND
, som inte är giltig syntax.
Förbättringsförslag (inte fel i sig, men inte heller bästa praxis):
- Som Frederik föreslog, är det vanliga sättet att sätta
%
tokens i parametern, istället för att göra strängsammansättning i SQL. - Om du inte uttryckligen använder en skiftlägeskänslig sortering för din databas, bör jämförelser vara skiftlägesokänsliga. Därför kanske du inte behöver
LOWER
.
Kodexempel:
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();