Tady děláte pár věcí špatně:
- Všem svým parametrům dáte stejný název
@searchitem
. To nebude fungovat. Parametry potřebují jedinečné názvy. - Pro každou položku vytvoříte nový příkaz SqlCommand. To nebude fungovat. Vytvořte SqlCommand jednou na začátku cyklu a poté nastavte
CommandText
jakmile dokončíte vytváření SQL. - Váš SQL končí na
AND
, což není platná syntaxe.
Návrhy na zlepšení (samy o sobě nejsou špatné, ale ani nejlepší postupy):
- Jak navrhl Frederik, obvyklým způsobem je zadat
%
tokeny v parametru, spíše než zřetězení řetězců uvnitř SQL. - Pokud pro svou databázi výslovně nepoužijete řazení rozlišující malá a velká písmena, neměla by se při porovnávání rozlišovat malá a velká písmena. Proto možná nebudete potřebovat
LOWER
.
Příklad kódu:
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();