c# - 从列表框控件构建 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();
解决方案
您可以获取所有选定的项目并将它们存储在一个变量中,然后在您的命令中使用它,如下所示:
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
推荐阅读
- php - 如何根据当前时间从数据库中选择
- javascript - Ajax Vanilla JS - ajax 异步继续而不等待 readyState 4,状态 200
- javascript - 如何在 vue.js 中格式化以千、百万或十亿为单位的数字?
- c - 如何检查图中的循环?
- javascript - Node.js,通过对象数组进行映射,并将特定值放入新数组中
- kubernetes - 如何将一个持久卷声明的数据与另一个隔离
- mongodb - 使用来自不同集合的字段的 MongoDB 查询
- python - 按多个元素按升序和降序排列元组列表
- sql - 基于 DATE_TRUNC 的 SQL 查询中的项目计数总和
- android - 如何从firebase预构建登录ui注销