c#fill combobist来自combobox SQL

时间:2017-02-09 13:34:49

标签: c# sql combobox checkedlistbox

我在c#中获取了winform应用程序从SQL服务器数据库中获取值。 我可以在combobox中获取我想要的值,但是根据所做的选择,我想在checkedcombobox中显示相应的sql行,供用户选择所需的值。 我的代码是:(填充组合框)

    SqlDataAdapter SDA = new SqlDataAdapter("select distinct desempenho from vidros", con);
    DataTable DTT = new DataTable();
    SDA.Fill(DTT);
    desempenho.Items.Clear();
    foreach (DataRow ROW in DTT.Rows)
    {
        desempenho.Items.Add(ROW["desempenho"].ToString());
    }

并且:(在checkcombobox中显示所选行)女巫无法正常工作。

 private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            SqlDataAdapter sda = new SqlDataAdapter("select desc from vidros where desempenho ='" + desempenho.Text + "'", con);
            DataTable DTT = new DataTable();
            sda.Fill(DTT);
            checkedListBox1.Items.Clear();
            foreach (DataRow AB in DTT.Rows)
            {
                checkedListBox1.Items.Add(AB["desc"].ToString());
            }
        }

这是为用户提供多种选择的最佳方式吗? 有谁知道代码可能出现什么问题?

提前致谢。

2 个答案:

答案 0 :(得分:1)

这个错误迟早会发生在每个人身上。

DESC几乎是任何存在的数据库系统中的保留关键字。它在ORDER BY子句中用于使结果按降序排序。

因此,如果您确实有一个以这种方式命名的字段(最好尽快更改该名称),则需要将其括在转义字符中(Sql Server使用方形块)

SqlDataAdapter sda = new SqlDataAdapter(@"select [desc] 
       from vidros where desempenho ='" + desempenho.Text + "'", con);

说我还建议使用参数化查询。在你的情况下,你应该是相对安全的,但最好完全避免任何sql注入的可能性

SqlDataAdapter sda = new SqlDataAdapter(@"select [desc] 
       from vidros where desempenho = @emp", con);
sda.SelectCommand.Parameters.Add("@emp", SqlDbType.NVarChar).Value = desempenho.Text;
 .....

答案 1 :(得分:1)

看起来绑定列表框的代码放在不正确的位置。 如果要根据组合框的选定项绑定列表框,则需要在组合框的SelectedIndexChanged事件中编写该逻辑。

如果您将代码移动到combobox的SelectedIndexChanged事件处理程序,如下所示。

private void desempenho_SelectedIndexChanged(object sender, EventArgs e)
    {
        SqlDataAdapter sda = new SqlDataAdapter("select desc from vidros where desempenho ='" + desempenho.Text + "'", con);
        DataTable DTT = new DataTable();
        sda.Fill(DTT);
        checkedListBox1.Items.Clear();
        foreach (DataRow AB in DTT.Rows)
        {
            checkedListBox1.Items.Add(AB["desc"].ToString());
        }
    }

将此处理程序附加到处理程序的SelectedIndexChanged事件,它应该解决问题。