我有一个关键字列表,我存储在列表中.
要从表中获取记录,请使用以下查询:
sqlBuilder.Append("SELECT name, memberid FROM members WHERE");
StringBuilder sqlBuilder = new StringBuilder();
foreach (string item in keywords)
{
sqlBuilder.AppendFormat(" LOWER(Name) LIKE '%{0}%' AND", item);
}
string sql = sqlBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)
您可能已经注意到,我的查询容易受到sql注入,因此我想使用SqlCommand()来使用参数.我尝试了以下但仍然无法正常工作:
foreach (string item in keywords)
{
sqlBuilder.AppendFormat(" LOWER(Name) LIKE '%' + @searchitem + '%' AND", item);
SqlCommand cmd = new SqlCommand(sqlBuilder.ToString());
cmd.Parameters.AddWithValue("@searchitem",item);
}
Run Code Online (Sandbox Code Playgroud)
我在哪里可以犯这个错误,或者更确切地说,我应该怎么做?
Hei*_*nzi 14
你在这里犯了一些错误:
@searchitem
.那不行.参数需要唯一的名称.CommandText
在创建完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();
Run Code Online (Sandbox Code Playgroud)