2015-09-28 41 views
0

我正在处理我的Windows窗体应用程序。在这个winform中,我有一个checkListBox,它绑定了我的sql数据库中的数据。我试图将checkListBox的checkedItem匹配到我的sql表列的文本,该文本以nvarchar数据类型存储。我运行了调试模式,发现程序执行时它跳过了整个while循环。我不知道为什么,因为有价值的名称items也确实显示该复选框在checkListBox检查如何读取列SqlDataReader

这是我的代码。

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  
    } 
} 

下面是截图。我试图在列,以获取中国人名(不用担心它是什么笑)

enter image description here

+1

你可能想做一些关于SQL注入的阅读。 – Paddy

+0

您可能需要从添加'checkedItems'到'string'的'用逗号分隔,你可以使用'SQL query'了'foreach'这样的事情外foreach':'选择MY_TABLE *其中employeename在(” “+ string_used_to_add_checkedItems +”');' – Wanderer

+0

您的*查询*生成正确吗?查询变量的价值是什么,你能证明这一点吗?我怀疑*项目*是造成问题。 – niksofteng

回答

1

您的代码中有多个问题。您无需在ForEach循环中编写查询。如果您希望从checklistbox获取多个值,那么equalto = operator不是您的朋友,您需要使用IN运算符。现在检查下面的例子。

private void button1_Click(object sender, EventArgs e) 
{ 
    string items = string.Empty; 

    foreach (var item in checkedListBox1.CheckedItems) 
    { 
     if (items.Length == 0) 
      items = item.ToString(); 
     else 
      items = items + "," + item;    
    } 

    //make myCommand object and open connection on your own 
    myCommand = new SqlCommand(query, myConn); 

    string query = @'select distinct firstName, lastName, chineseName, teacherEmail, entryYear, leaveYear, userLoginId, ad.applicationId 
    from [teacher_detail] as td 
    LEFT JOIN[class_detail] as cd ON td.teacherId = cd.teacherId 
    LEFT JOIN[application_teacher] as at ON at.teacherId = td.teacherId 
    LEFT JOIN[application_detail] as ad ON at.applicationId = ad.applicationId 
    Where ad.applicationId = 2 
    and chineseName in (@name)' 

    myCommand.Parameters.Add("@name", SqlDbType.nvarchar); 
    myCommand.Parameters["@name"].Value = items; 

    //now execute query 

} 
+0

这段代码不会通过这个测试:假设我有一个叫做vardhan的男人,我立即就有一个叫做harsh的男人!两行都被选中!现在假设DB中有第三个人,名字叫harshvardhan!即使他的名字没有被选中/检查,数据读取器也会在结果中错误地存储这一行 –

0

如在数据库中的数据类型为nvarchar是在你的代码修改下面的语句尝试

string query = "select * from my_table WHERE employeeName = '"+items+"'" 

string query = "select * from my_table WHERE employeeName = N'"+items.ToString()+"'" 

前缀 'N' 用于将值从检查项目

比较
+0

在拉梅什,它说不正确的语法附近“someName” – RedRocket

+0

@DragonBorn我测试了它,对我工作的罚款。我花了表类型为nvarchar的列,使用checkedlistbox,也做了同样的查询,你和'而(dr.read())'对我来说工作很好 –

+0

@DragonBorn是你的列表框,显示中文名字或英文名字? –