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

时间:2013-04-16 09:24:58

标签: c# asp.net foreach stringbuilder 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(")");
}

我需要测试该项目是否是循环中的最后一项,以便它不会在结束“”之前放入“,”。

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

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

提前致谢

5 个答案:

答案 0 :(得分:4)

这样做有很多方法。

您可以使用string.TrimEnd从字符串中删除额外的逗号,也可以使用string.Join创建新字符串,例如

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

答案 1 :(得分:1)

您可以将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)));
}

答案 2 :(得分:1)

尝试使用linq

selectQuery.Append("AND SALES_GROUP IN (");

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

selectQuery.Append(")");

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

答案 3 :(得分:0)

试试这个:

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(")");
}

查看this示例,了解有关.Aggragate(...)方法

的更多信息

答案 4 :(得分:0)

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