SQL阅读器不能读取所有的checkListBox checkkeditems
本文关键字:checkListBox checkkeditems 读取 不能读 不能 SQL | 更新日期: 2023-09-27 18:14:53
我正在使用c#开发一个windows窗体应用程序。我有一个问题,试图从我的checkListBox到我的sql数据复选框列匹配选中的数据。我要做的是将checkListBox绑定到我的数据库表中的一个列,让我们称之为employee_detail,它可以正确地从数据库中获取数据。然而,当我试图从该checklistbox导出选中的项目时,我只能从checklistbox读取第一个选中的项目。如果我有3个项目,我选中了所有3个项目,我的excel 只显示第一个选中的项目。我也不知道为什么。例如,我有艾米,彼得和吉米在我的checkListBox。当我选择Amy时,它将把Amy的名字导出到我的excel表中。但是,如果我选择了所有3个(Amy, Peter和Jimmy),即使我选中了3,它也只会将Amy导出到我的excel中。我不知道为什么不行。
我第一次尝试的。这完全是一场灾难。我的数据阅读器中的HasRow不能从我的数据库中获取任何列,即使我可以在我的sql控制台中执行相同的查询并找到我正在寻找的列。从HasRow = false
开始,这个循环将跳过while循环中的内容这是我第一次尝试
foreach(var items in checkListBox1.CheckedItems){
string query = "select * from my_table WHERE employeeName = '"+items+"'"
SqlCommand myCommand = new SqlCommand(query, myConn);
SqlDataReader dr = myCommand.ExecuteReader();
while(dr.Read()){
//read the column
}
}
我的第二次尝试是使用参数,这似乎有效,但问题(我上面建议的)是我的excel文件只显示了第一个检查项(我相信它只通过while循环一次),当我的db表有多个记录
这是我第二次尝试
foreach (var item in employeeCheckListBox.CheckedItems)
{
if (items.Length == 0)
{
items = item.ToString();
}
else
{
items = items + "," + item;
}
string query = @"select * from [employeeId_detail] as td LEFT JOIN[order_detail] as cd ON td.employeeId = cd.employeeId Where employeeName in (@name)";
myCommand = new SqlCommand(query, myConn);
myCommand.Parameters.Add("@name", SqlDbType.NVarChar);
myCommand.Parameters["@name"].Value = items;
SqlDataReader dr = myCommand.ExecuteReader();
while (dr.Read())
{
i++;
{
string f_Name = dr.GetString(0);
string l_Name = dr.GetString(1);
string full_Name = dr.GetString(2);
string e_email = dr.GetString(3);
xlEmployeeDetail.Cells[i, 1] = f_Name;
xlEmployeeDetail.Cells[i, 2] = l_Name;
xlEmployeeDetail.Cells[i, 3] = full_Name;
xlEmployeeDetail.Cells[i, 4] = e_email;
}
}
dr.Close();
}
参考我们的聊天:问题不在你写的代码块中。问题在于您用于从数据库中获取内容的字符。
正如我们测试的那样,这段代码在English characters
上工作得很好,但在Chinese characters
上却失败了,这是一个单独的问题。
但是,如果您仍然要使用中文字符,那么可能需要在DB级别进行设置,并且相同的代码将正常工作。
参数化绝对是更好的方法,就像第二个例子一样。
问题是,我很确定你的查询最终看起来像这样,在那里你传递它一个单一的名称与一对逗号在它,而不是一个单独的名称列表:
select *
from [employeeId_detail] as td
LEFT JOIN[order_detail] as cd ON td.employeeId = cd.employeeId
Where employeeName in ('joe, bob, sue')
相反,这里有一些更动态的东西,为每个选中的项创建一个参数。
string parameterList = "";
int parameterCounter = 0;
// Add a parameter placeholder for each "checked" item
for (var i=0; i<checkListBox1.CheckedItems.Count; i++)
parameterList += (i==0) ? "@p" + i : ", @p" + i;
string query = @"select *
from [employeeId_detail] as td
LEFT JOIN[order_detail] as cd ON td.employeeId = cd.employeeId
Where employeeName in (" + parameterList + ")";
myCommand = new SqlCommand(query, myConn);
// Now give each parameter a value from the collection of checked items
for (var i = 0; i < checkListBox1.CheckedItems.Count; i++)
myCommand.Parameters.AddWithValue("@p" + i, checkListBox1.CheckedItems[i].ToString());
SqlDataReader dr = myCommand.ExecuteReader();