在 c# 中使用由 "OR" 和 "Append" 分隔的两个 "In Clause" 时,')' 附近的语法不正确
Incorrect Syntax Near ')' When Using Two "In Clause" Separated by "OR" and "Append" in c#
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(")");
由于某些原因,在执行代码时,')' 附近出现了错误的语法。当我删除从“OR Brand2 ......”开始的后半部分和循环时,一切正常但显然不在 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})";
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(")");
由于某些原因,在执行代码时,')' 附近出现了错误的语法。当我删除从“OR Brand2 ......”开始的后半部分和循环时,一切正常但显然不在 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})";