我正在使用c#处理Windows窗体应用程序。我有一个问题,试图将检查数据从我的checkListBox匹配到我的SQL数据复选框列。我想要做的是将checkListBox绑定到我的数据库表中的一个列,让我们称之为employee_detail,它可以正确地从数据库中获取数据。但是,当我尝试从该核对表列表中导出已检查的项目时,我只能从核对表列表中读取第一个已检查的项目。如果我有3个项目并且我检查了所有3个项目,我的Excel 仅显示第1个已检查项目。我不知道为什么。例如,我的checkListBox中有Amy,Peter和Jimmy。当我选择Amy时,它会将名称Amy导出到我的excel表中。但是,如果我选择所有3(Amy,Peter和Jimmy),它只会将Amy导出到我的excel,即使我已经检查了3。我不知道它为什么不起作用。
我第一次尝试了什么。这是一场彻底的灾难。我的datareader中的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();
}
答案 0 :(得分:1)
参数化肯定是更好的方法,就像你的第二个例子一样。
问题是,我相当肯定您的查询最终会看起来像这样,您在其中传递一个名称,其中包含一些逗号,而不是单独的名称列表:
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();
答案 1 :(得分:1)
参考我们的聊天:问题不在您编写的代码块中。问题在于您用于从DB中获取内容的字符。
正如我们测试的那样,这个代码块与English characters
一起工作正常,但未能Chinese characters
,这一直是一个单独的问题。
但是,如果您仍然使用中文字符,则可能需要在数据库级别进行设置,并且您的相同代码将正常工作。