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

SQL阅读器不能读取所有的checkListBox checkkeditems

参考我们的聊天:问题不在你写的代码块中。问题在于您用于从数据库中获取内容的字符。

正如我们测试的那样,这段代码在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();