首页 > 解决方案 > 从列表框控件构建 SQL IN 语句 Return Nothing

问题描述

我有一个具有多个选择值的 ListBox。我正在尝试从员工表中获取数据。根据此 ListBox 中的值,我尝试在语句中使用。我检查了查询,它是真的,但仍然没有获取任何数据而没有任何错误。

这是代码:

StringBuilder sb = new StringBuilder("SELECT * FROM Emp_Attend LEFT JOIN Employees on Emp_Attend.Emp_ID = Employees.EmpID WHERE ");
    
StringBuilder sb = new StringBuilder("SELECT * FROM Emp_Attend LEFT JOIN Employees on Emp_Attend.Emp_ID = Employees.EmpID WHERE ");

using (SqlCommand cmdSQL = new SqlCommand())
{
    sb.Append("Emp_Attend.Emp_Name IN (");
    string InPartQuery = string.Join(",", ListBox1.Items
                                      .Cast<ListItem>()
                                      .Where(t => t.Selected)
                                      .Select(r => "'" + r.Text + "'"));
    sb.Append(InPartQuery);
    sb.Append(")");
    cmdSQL.CommandText = sb.ToString();
    cmdSQL.Connection = sqlcon;
    SqlDataAdapter da = new SqlDataAdapter(cmdSQL);
    DataTable dtbl = new DataTable();
    da.Fill(dtbl);
    sqlcon.Close();
    gvEmployees.DataSource = dtbl;
    gvEmployees.DataBind();

标签: c#asp.netsql-serverwebforms

解决方案


您可以获取所有选定的项目并将它们存储在一个变量中,然后在您的命令中使用它,如下所示:

List<string> ids = new List<string>();
        foreach (var item in listBox1.SelectedItems)
        {
            ids.Add(item.ToString());
        }
        string command = $"SELECT * FROM Emp_Attend LEFT JOIN Employees on Emp_Attend.Emp_ID = Employees.EmpID WHERE Emp_Attend.Emp_Name in ({string.Join(",",ids)})";

但我建议您将其设为参数化以避免SQL Injection


推荐阅读