从列表框控件构建SQL IN语句



我试图使用StringBuilder建立一个SQL查询,我已经成为卡住试图做WHERE子句的一部分。

我有一个列表框的一堆值,并允许多次选择。我需要迭代选定的项目,并将其放在IN语句中,如…

WHERE SOME_FIELD IN ('Value','NextValue','AnotherValue')

到目前为止,我写的代码是这样的…

if (lstSalesGroup.SelectedItem != null)
{
    selectQuery.Append("AND SALES_GROUP IN (");
    foreach (ListItem item in lstSalesGroup.Items)
    {
        if (item.Selected)
            selectQuery.Append("'" + item.Value + "',");
    }
    selectQuery.Append(")");
}

我需要测试项目是否是循环中的最后一个,这样它就不会在结束的")"之前加上","。

我该怎么做?或者如果有更好的方法来构建这部分查询,请建议,我还在学习,我们都必须从某个地方开始!:)

最终这将是一个零件搜索的查询。

Thanks in advance

有两种方法。

可以使用string。TrimEnd从字符串中删除额外的逗号,或者您可以使用string创建一个新字符串。加入像

string InPartQuery = string.Join(",", lstSalesGroup.Items
                                          .Cast<ListItem>()
                                          .Where(t => t.Selected)
                                          .Select(r => "'" + r.Value + "'"));

您可以使用String.JoinLinq

为清楚起见,我把代码放在变量中。

if (lstSalesGroup.SelectedItem != null)
{
    var queryStr = "AND SALES_GROUP IN ({0})";
    var selectedItemValues = (from itm in lstSalesGroup.Items.Cast<ListItem>()
                              where itm.Selected
                              select String.Format("'{0}'", itm));
    selectQuery.Append(String.Format(queryStr, String.Join(",", selectedItemValues)));
}

尝试使用linq

selectQuery.Append("AND SALES_GROUP IN (");
selectQuery.Append(string.Join(",", lstSalesGroup.Items.Select(i => "'" + i.Value + "'")));    
selectQuery.Append(")");

这将解决您的问题,但是您在这里遇到SQL注入的问题。我强烈建议您在查询中使用参数

Dim s As String = "'"
    For i = 0 To ListBox1.Items.Count - 1
        s = s & ListBox1.Items.Item(i) & "','"
    Next

试试这个:

if (lstSalesGroup.SelectedItem != null)
{
    selectQuery.Append("AND SALES_GROUP IN (");
    var local = lstSalesGroup.Items.Where(c => c.Selected)
                       .Select(c => "'"+c.Value+"'")
                       .Aggregate((c,n) => c+ ", "+n);
   selectQuery.Append(local);            
   selectQuery.Append(")");
}
关于.Aggragate(...)方法的更多信息请看这个例子

最新更新