【问题标题】:Building SQL IN statement from listbox control Return Nothing从列表框控件构建 SQL IN 语句 Return Nothing
【发布时间】:2021-03-11 10:56:07
【问题描述】:

我有一个包含多个选择值的列表框。我正在尝试从员工表中获取数据。根据此 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.net sql-server webforms


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    最好的办法是使用参数而不是字符串连接。以下代码可以在我的GitHub repository 中找到,以下class project 提供了创建参数的方法和frontend project。 在使用参数时,以下内容可能显得矫枉过正,以使您的数据在参数中保持安全/不被窥探。所有代码都可以通过下面帖子中的链接在 GitHub 上获得。在下面的屏幕截图中,前两个示例未参数化,而第三个(硬编码按钮)完全参数化。

    下面的类method 将生成一个不带参数但处理格式的 SQL WHERE IN,例如字符串中的撇号,只留下数字。

    在以下屏幕截图中,两个组框演示了上述内容。

    对于参数化有BuildWhereInClause(string partialClause, string paramPrefix, IEnumerable parameters)。在下面的代码示例中,BuildWhereInClause 创建 SQL,而 AddParamsToCommand 为生成的 SQL 语句创建参数

    SELECT C.CustomerIdentifier , C.CompanyName , C.ContactName , C.ContactTypeIdentifier , FORMAT(C.ModifiedDate, 'MM-dd-yyyy', 'en-US') AS ModifiedDate, CT.ContactTitle FROM dbo.Customers AS C INNER JOIN dbo.ContactType AS CT ON C.ContactTypeIdentifier = CT.ContactTypeIdentifier WHERE CT.ContactTitle IN (@CTContactTitle0,@CTContactTitle1) ORDER BY C.CompanyName
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 2020-02-16
      • 2022-12-05
      • 1970-01-01
      • 2017-06-07
      相关资源
      最近更新 更多