Тук правите няколко неща грешно:
- Давате на всички ваши параметри едно и също име
@searchitem
. Това няма да работи. Параметрите се нуждаят от уникални имена. - Създавате нова SqlCommand за всеки елемент. Това няма да работи. Създайте SqlCommand веднъж в началото на цикъла и след това задайте
CommandText
след като приключите със създаването на SQL. - Вашият SQL завършва с
AND
, което не е валиден синтаксис.
Предложения за подобрение (само по себе си не е грешно, но не и най-добра практика):
- Както предложи Фредерик, обичайният начин е да поставите
%
токени в параметъра, вместо да прави конкатенация на низове вътре в SQL. - Освен ако изрично не използвате сортиране, чувствително към малки и главни букви за вашата база данни, сравненията не трябва да чувствителни към главни и малки букви. Следователно може да не се нуждаете от
LOWER
.
Пример за код:
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();