Robisz tu kilka rzeczy źle:
- Nadajesz wszystkim swoim parametrom tę samą nazwę
@searchitem
. To nie zadziała. Parametry wymagają unikalnych nazw. - Tworzysz nową SqlCommand dla każdego elementu. To nie zadziała. Utwórz SqlCommand raz na początku pętli, a następnie ustaw
CommandText
po zakończeniu tworzenia SQL. - Twój SQL kończy się na
AND
, co jest nieprawidłową składnią.
Propozycje ulepszeń (nie są złe per se, ale też nie są najlepszymi praktykami):
- Jak zasugerował Frederik, zwykłym sposobem jest umieszczenie
%
tokeny w parametrze, zamiast wykonywać konkatenację ciągów wewnątrz SQL. - O ile nie używasz jawnie sortowania z rozróżnianiem wielkości liter w bazie danych, porównania nie powinny uwzględniać wielkości liter. Dlatego możesz nie potrzebować
LOWER
.
Przykład kodu:
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();