SQL阅读器无法读取所有checkListBox checkedItems

时间:2015-09-29 02:13:13

标签: c# sql-server excel

我正在使用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();
        }

2 个答案:

答案 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,这一直是一个单独的问题。

但是,如果您仍然使用中文字符,则可能需要在数据库级别进行设置,并且您的相同代码将正常工作。