C# 组合框SelectedIndexChanged和Mysql致命错误

C# 组合框SelectedIndexChanged和Mysql致命错误,c#,mysql,select,combobox,C#,Mysql,Select,Combobox,我目前在双组合框选择查询中遇到问题。。。选择第一个组合框值后,它将该值发送到数据库,并使第二个组合框填充。但是,当从第一个组合框中选择时,数据库中的异常中出现了一个致命错误。如果我运行一个不涉及第一个组合框的查询,它将正常运行 这是我的代码,我一直在玩查询行。。。因此,如果这是错误的,我不会感到惊讶 private void cmbDepartment_SelectedIndexChanged(object sender, EventArgs e) { t

我目前在双组合框选择查询中遇到问题。。。选择第一个组合框值后,它将该值发送到数据库,并使第二个组合框填充。但是,当从第一个组合框中选择时,数据库中的异常中出现了一个致命错误。如果我运行一个不涉及第一个组合框的查询,它将正常运行

这是我的代码,我一直在玩查询行。。。因此,如果这是错误的,我不会感到惊讶

private void cmbDepartment_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                MySqlConnection connection = new MySqlConnection("server=127.0.0.1;Port=3306;database=mydatabase;uid=admin;Pwd=mypw1234;");

                string selectQuery = "SELECT `name` FROM `employees` WHERE `department` LIKE ?department";
                connection.Open();
                MySqlCommand command = new MySqlCommand(selectQuery, connection);
                MySqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    command.Parameters.AddWithValue("?department",cmbDepartment.Text);
                    cmbName.Items.Add(reader.GetString("name"));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
异常显示“在命令执行期间遇到致命错误” 有人能解释我做错了什么吗

编辑 当我运行它时,它说我在“Projects”附近的语法中有一个问题,它的名称是“specialprojects”。。。但是如果我用“特殊项目”运行直接查询,它会很好地工作

string selectQuery = "SELECT `name` FROM `employees` WHERE `department` = " + cmbDepartment.Text + "";

每次读卡器读取一行时,您都会继续创建参数:

while (reader.Read())
{
    command.Parameters.AddWithValue("?department", cmbDepartment.Text);
    cmbName.Items.Add(reader.GetString("name"));
}
更糟糕的是,在执行命令之前没有传递它,因此命令中没有
department
参数

您的代码应该如下所示:

// add the parameter first
command.Parameters.AddWithValue("?department", cmbDepartment.Text);

// Now execute the command. Now it has the parameter
MySqlDataReader reader = command.ExecuteReader();

// Now populate your combo box
while (reader.Read())
{
    cmbName.Items.Add(reader.GetString("name"));
}

每次读卡器读取一行时,您都会继续创建参数:

while (reader.Read())
{
    command.Parameters.AddWithValue("?department", cmbDepartment.Text);
    cmbName.Items.Add(reader.GetString("name"));
}
更糟糕的是,在执行命令之前没有传递它,因此命令中没有
department
参数

您的代码应该如下所示:

// add the parameter first
command.Parameters.AddWithValue("?department", cmbDepartment.Text);

// Now execute the command. Now it has the parameter
MySqlDataReader reader = command.ExecuteReader();

// Now populate your combo box
while (reader.Read())
{
    cmbName.Items.Add(reader.GetString("name"));
}

知道错误是什么吗?在执行命令之前设置参数。如果您想改进应用程序,ex会说“在命令执行过程中遇到致命错误”-填充第二个组合框的方式是无效的,所有对数据库的多次调用都会消耗大量资源。更好的做法是,每次更改combobox1值时,使用数据库中的所有信息设置一个
datatable
,而不是使用
LINQ
或带有循环的事件(如果没有太多记录)查询datatable。@jonathana如果用户从未从combobox中选择任何内容,您无缘无故加载了所有项目。另外,如果有一百万行或更多的事件,您想将它们全部加载到一个数据表中呢?这不是一个好建议。知道错误是什么吗?在执行命令之前设置参数。如果您想改进应用程序,ex会说“在命令执行过程中遇到致命错误”-填充第二个组合框的方式是无效的,所有对数据库的多次调用都会消耗大量资源。更好的做法是,每次更改combobox1值时,使用数据库中的所有信息设置一个
datatable
,而不是使用
LINQ
或带有循环的事件(如果没有太多记录)查询datatable。@jonathana如果用户从未从combobox中选择任何内容,您无缘无故加载了所有项目。另外,如果有一百万行或更多的事件,您想将它们全部加载到一个数据表中呢?那不是个好建议。我明白了。。。叹息。。。一旦我觉得我犯了错误,我就会犯这样的错误。。。工作起来很有魅力。注意:)感谢您使用命令生成器和数据适配器执行相同的操作来填充数据网格?您可以使用任何您想要的东西。它只需要数据,而不在乎你如何获得数据。即使你从网络服务中获取数据,它也能工作。是的,我刚刚想出了方法:)我明白了。。。叹息。。。一旦我觉得我犯了错误,我就会犯这样的错误。。。工作起来很有魅力。注意:)感谢您使用命令生成器和数据适配器执行相同的操作来填充数据网格?您可以使用任何您想要的东西。它只需要数据,而不在乎你如何获得数据。即使您从web服务获取数据,它也会工作。是的,我刚刚想出了方法:)