Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和mysql有问题_C#_Mysql_Datareader - Fatal编程技术网

C#和mysql有问题

C#和mysql有问题,c#,mysql,datareader,C#,Mysql,Datareader,我正在尝试制作一个小的桌面应用程序,使我的游戏服务器上的白名单玩家更加简单。我遇到了一些问题。这里有一些代码 private void identityCombo_SelectedIndexChanged(object sender, EventArgs e) { if(connection.State == ConnectionState.Closed) { connection.Open(); }

我正在尝试制作一个小的桌面应用程序,使我的游戏服务器上的白名单玩家更加简单。我遇到了一些问题。这里有一些代码

       private void identityCombo_SelectedIndexChanged(object sender, EventArgs e)
    {

        if(connection.State == ConnectionState.Closed)
        {
            connection.Open();
        }

        jobsCombo.Enabled = true;
        gradesCombo.Enabled = true;
        groupCombo.Enabled = true;

        String query = "SELECT * FROM users WHERE identifier=@id";
        MySqlCommand cmd = new MySqlCommand(query, connection);

        cmd.Parameters.AddWithValue("@id", identityCombo.SelectedItem);

         MySqlDataReader reader = cmd.ExecuteReader();

        groupCombo.Enabled = true;

        while (reader.Read())
        {
            steamNameBox.Text = reader["name"].ToString();
            jobsCombo.SelectedIndex = jobsCombo.FindString(reader["job"].ToString());
            cashBox.Text = "$" + String.Format("{0:n0}", reader["money"].ToString());
            bankBox.Text = "$" + String.Format("{0:n0}", reader["bank"].ToString());
        }

        steamNameBox.Visible = true;
        steamNameLbl.Visible = true;
        cashLbl.Visible = true;
        bankLbl.Visible = true;
        bankBox.Visible = true;
        cashBox.Visible = true;
        bankLbl.Visible = true;
        groupLbl.Visible = true;
        groupCombo.Visible = true;
        phoneNumBox.Visible = true;
        phoneNumLbl.Visible = true;
        esxLbl.Visible = true;
        jobLbl.Visible = true;
        gradesLbl.Visible = true;
        jobsCombo.Visible = true;
        gradesCombo.Visible = true;
        updateInfoBtn.Visible = true;
    }
我想做的是让我的登录系统(很好,没有问题),但它会弹出另一个菜单。在服务器上,您可以有多个标识。我有办法选择它们,而且都很好

我的问题是:

       while (reader.Read())
        {
            steamNameBox.Text = reader["name"].ToString();
            jobsCombo.SelectedIndex = jobsCombo.FindString(reader["job"].ToString());
            cashBox.Text = "$" + String.Format("{0:n0}", reader["money"].ToString());
            bankBox.Text = "$" + String.Format("{0:n0}", reader["bank"].ToString());
        }
我正在更改“jobsCombo.SelectedIndex”,这将触发我设置的事件,该事件将根据所选作业的级别加载“作业等级”(等级)

    private void jobsCombo_SelectedIndexChanged(object sender, EventArgs e)
    {
        loadJobGrades(jobsCombo.SelectedItem.ToString());
    }
下面是界面的图片,以提供更多细节

所有信息按程序从数据库中提取,作业根据数据库中的信息自动从左侧的组合框中选择。好吧,问题是——当更改“职务”选择时,它应该填充右侧的职务等级,但事实并非如此

        private void loadJobGrades(String job)
    {

        String query = "SELECT * FROM job_grades WHERE job_name=@job";
        MySqlCommand cmd = new MySqlCommand(query, connection);

        cmd.Parameters.AddWithValue("@job", job);

        MySqlDataReader reader = cmd.ExecuteReader();

        MessageBox.Show("1");
        while (reader.Read())
        {
            gradesCombo.Items.Add(reader["label"]);
            MessageBox.Show("2");
        }
    }
        private void jobsCombo_SelectedIndexChanged(object sender, EventArgs e)
    {
        loadJobGrades(jobsCombo.SelectedItem.ToString());
    }
代码的第二部分应该根据当前选择的“作业”框加载等级/等级

第一个代码的问题是我需要创建/执行一个新的读卡器,这就是问题所在。我得到“已经有一个打开的DataReader与此连接关联”,因为它是从一个事件运行的,这个事件也是通过填充组合框触发的


我已经想了10个小时了,请帮忙。

你忘了关闭阅读器。在所有ADO.NET教程中,您将看到连接、命令和读取器都是在
中使用
块创建的。不使用全局连接,每次都会创建并打开一个新连接。连接池确保了这是一个廉价的操作,所以我应该用块把所有东西都放进去,它会神奇地修复它吗?如果我打开一个读卡器,从读卡器中获取信息以填充作业组合并设置索引,它会触发索引更改事件,这将打开另一个读卡器。基本上,我说的是我的datareader,它正在获取信息并在左侧组合框中选择他们的作业,同时也会触发打开新数据读卡器的事件,因为我打开了一个新读卡器并关闭了它,第一个datareader中的其余部分无法完成,因为该读取器现在已关闭。如果这有道理的话@泛神经炎Kanavos@PanagiotisKanavos我不得不在我的手机上切换到桌面模式,因为你忘了关闭阅读器。在所有ADO.NET教程中,您将看到连接、命令和读取器都是在
中使用
块创建的。不使用全局连接,每次都会创建并打开一个新连接。连接池确保了这是一个廉价的操作,所以我应该用块把所有东西都放进去,它会神奇地修复它吗?如果我打开一个读卡器,从读卡器中获取信息以填充作业组合并设置索引,它会触发索引更改事件,这将打开另一个读卡器。基本上,我说的是我的datareader,它正在获取信息并在左侧组合框中选择他们的作业,同时也会触发打开新数据读卡器的事件,因为我打开了一个新读卡器并关闭了它,第一个datareader中的其余部分无法完成,因为该读取器现在已关闭。如果这有道理的话@泛神经炎Kanavos@PanagiotisKanavos不得不在我的手机上切换到桌面模式