由于 C# 中对象的当前状态,操作无效

operation is not valid due to the current state of the object in C#

我的编码有问题。这是我为这个程序编写的源代码。

    OracleConnection kon;
    public Form2()
    {
        InitializeComponent();
        FillCombo();
    }

    void FillCombo()
    {
        OracleConnection kon = Koneksi.getKoneksi();
        OracleCommand cmd;
        try
        {
            kon.Open();
            cmd = new OracleCommand();
            cmd.Connection = kon;

            cmd.CommandText = "SELECT * FROM JOBS";

            OracleDataReader reader = cmd.ExecuteReader();
            comboBox1.Items.Add(reader.GetString(reader.GetOrdinal("JOB_ID")));
        }
        catch (Exception ex)
        {
            MessageBox.Show("Data has been failed to show: " + ex.Message);
        }
        finally
        {
            kon.Close();
            kon.Dispose();
        }
    }
 }

}

当我运行这个程序时,系统会显示对话框"operation is not valid due to the current state of the object"。

When I running the Program

There's No Error

如何解决这个错误?我会将数据从数据库绑定到组合框。我的意思是,我想 添加 JOB_ID 到组合框,例如 AD_VP、HR_REP,顺便说一句。

顺便说一句,如果我的英语不好,我很抱歉。

所以您要做的是将 JOB_ID 列的序号添加到组合框。您可能知道 GetOrdinal returns in int。 你为什么不这样走:

...   
comboBox1.Items.Add(Convert.ToString(reader.GetOrdinal("JOB_ID")));
...

一件明显缺失的事情是您在尝试读取数据 reader 之前没有调用 reader.Read()。当您调用 OracleDataReader reader = cmd.ExecuteReader(); 时,那一刻,数据 reader 位于 之前 第一条记录。您需要调用 reader.Read() 将其移动到第一条记录。这可以很容易地解释你得到的错误。

OracleDataReader reader = cmd.ExecuteReader();
reader.Read(); // Add this. Check for a return value of false if necessary.
comboBox1.Items.Add(reader.GetString(reader.GetOrdinal("JOB_ID")));

除此之外,妥善处理数据 reader 也是一个好主意。您可能需要为此使用 using 块。