在 c 中使用两个"In Clause"用 "OR" 和 "Append" 分隔时,接近 ')' 的语法不正确#


var cmd = new SqlCommand();
var sql = new System.Text.StringBuilder();
sql.Append("SELECT * FROM tbl_VSArticle WHERE ");
sql.Append("Brand1 in (");
int i, j;
for (i = 0; i < brandsList.Length; i++)
{
cmd.Parameters.Add("@" + i, brandsList[i]);
if (i > 0) sql.Append(", ");
sql.Append("@" + i);
}
sql.Append(") OR Brand2 in (");
for (j = i + 1; j < brandsList.Length; j++)
{
cmd.Parameters.Add("@" + j, brandsList[j]);
if (j > 0) sql.Append(", ");
sql.Append("@" + j);
}
sql.Append(")");

由于某些原因,在执行代码时,"("附近会出现不正确的语法。当我去掉后半部分和从"0"开始的循环时;OR品牌2&";,一切都很好,但显然无法在Brand2中搜索。有人能告诉我我看不见的错误在哪里吗?非常感谢。

问题是执行for (j = i + 1; j < brandsList.Length; j++),但此时i将等于上一个for循环中的brandsList.Length + 1,因此此循环将被完全跳过,从而导致"...Brand2 in ()"

您需要使其类似于for (j = 0; j < brandsList.Length; j++),然后对参数名称执行"@" + (i + j)以使其工作,但这里有一种更干净的方法来创建参数和sql。这两个列表不需要单独的参数,因为它们具有相同的值。

var cmd = new SqlCommand();
var namesAndValues = brandsList.Select((x,i) => new {Name = "@b" + i, Value = x});
foreach(var x in namesAndValues)
{
cmd.Parameters.Add(x.Name, x.Value);
}
var commaParamList = string.Join(", ", namesAndValues.Select(x => x.Name));
sql = $"SELECT * FROM tbl_VSArticle WHERE Brand1 in ({commaParamList})) OR Brand2 in ({commaParamList})";

最新更新