SQL读取器不能读取所有checkListBox checkedItems

我正在使用c#的窗体应用程序。 我有一个问题,试图匹配从我的checkListBox检查数据到我的SQL数据checkbox列。 我想要做的是将checkListBox绑定到我的数据库表中的一列,让我们称之为employee_detail,它可以正确地从数据库中获取数据。 但是,当我试图从checklistbox中导出选中的项目时,我只能从checklistbox中读取第一个选中的项目 。 如果我有3个项目,我检查了所有3个项目,我的Excel 只显示第一个检查项目 。 我不知道为什么。 例如,我在我的checkListBox中有Amy,Peter和Jimmy。 当我selectAmy时,它会把名字Amy输出到我的Excel表格中。 但是,如果我全部select了3个(艾米,彼得和吉米),那么即使我已经检查了3个,也只能把艾米输出到我的专业。 我不知道为什么它不起作用。

我第一次尝试。 这是一场完全的灾难。 我的数据库中的HasRow不能从我的数据库中获取任何列,即使我可以在我的SQL控制台执行相同的查询,并find我正在寻找的列。 自从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 } } 

我的第二个尝试是使用参数,这似乎工作,但问题(我上面build议)是我的Excel文件只显示第一个检查项目(我相信它只循环一次循环),当我的数据库表有多一条logging

这是我第二次尝试

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

参考我们的聊天 :问题不在您编写的代码块中。 问题在于用于从DB中提取内容的字符。

正如我们testing,这个代码块与English characters正常工作,但没有Chinese characters ,这是一个单独的问题。

但是,如果你仍然会去中文字符,那么你可能需要在数据库级别进行设置,并且相同的代码也可以正常工作。

参数化绝对是更好的方法,就像你的第二个例子。

问题是,我相当确定你的查询结果是这样的,在这里你传递给它一个名字,里面有一对逗号,而不是一个单独的名字列表:

 select * from [employeeId_detail] as td LEFT JOIN[order_detail] as cd ON td.employeeId = cd.employeeId Where employeeName in ('joe, bob, sue') 

相反,这里有更多的dynamic,为每个检查项目创build一个参数。

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