ここでいくつか間違ったことをしています:
- すべてのパラメータに同じ名前を付けます
@searchitem
。それはうまくいきません。パラメータには一意の名前が必要です。 - アイテムごとに新しいSqlCommandを作成します。それはうまくいきません。 SqlCommandを1回作成します ループの開始時に
CommandText
を設定します SQLの作成が完了したら。 - SQLは
AND
で終わります 、これは有効な構文ではありません。
改善の提案(それ自体は間違っていませんが、ベストプラクティスでもありません):
- Frederikが提案したように、通常の方法は
%
を配置することです。 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();