0

我有一个 SQL Server 数据库,我正在尝试查询它。首先,我从名为 的表中检索所有名称和 id Firms,用它来填充ListBox. 当我单击该列表框中的一个项目时,我想ListBox用为该公司工作的员工填充另一个项目。

我使用这个查询(在 SQL Server 2008 中测试)

SELECT
    employee.Name
From
    employee, Firm
WHERE
    Firm.Name = 'Some Firm' AND
    Firm.F_Id = employee.F_Id

这是单击列表框项的代码:

private void Firm_ListBox_SelectedIndexChanged(object sender, EventArgs e)
{
        String Name = "";
        Int32 F_Id = -1;

        // This for would be useful later on in the program
        // For now it can be ignored
        for (int i = 0; i < Firms.Count(); i++)
        {
            if (Firms.ElementAt(i).GetFirmName().Equals(Firm_ListBox.SelectedItem.ToString()))
            {
                Name = Firms.ElementAt(i).GetFirmName();
                F_Id = Firms.ElementAt(i).GetF_Id();
            }
        }

        MessageBox.Show(Name.ToString() + "\n\t" + F_Id.ToString()); // first message box

        SqlCommand SqlCommand = new SqlCommand(
            "SELECT employee.Name From employee, Firm WHERE Firm.Name = " + "'" + 
             Name + "'" + " AND Firm.F_Id = employee.F_Id", SqlConnection);
        SqlDataReader SqlDataReader = SqlCommand.ExecuteReader();

        MessageBox.Show("Test: " + SqlDataReader.GetString(1)); // second message box

        Employee_ListBox.Items.Clear();
        while (SqlDataReader.Read())
        {
            Employee_ListBox.Items.Add(SqlDataReader.GetString(1));
            MessageBox.Show(SqlDataReader.GetString(1));
        }

        SqlDataReader.Close();
    }

第一个MessageBox有效,但第二个没有出现。我不知道这里发生了什么(更不用说我ListBox的没有被填充)。

编辑在调试时,我意识到在读取操作之后,当我尝试获取字符串时,我得到了一个可怕的异常(我添加了一个 try-catch 块)。我什至无法开始阅读它,除了这个

不存在数据时尝试读取无效。

吸引住了我的眼球。然而我无法解释。连接有效,我测试过的查询。即使它没有返回任何东西......它不应该什么都不打印移动一个吗?

EDIT2似乎我得到了一个无效的操作异常,不是在阅读器上,而是在消息框上。

4

1 回答 1

1

在第二个消息框中,您已将其作为消息的一部分:

SqlDataReader.GetString(1)

因为您还没有从数据阅读器中读取任何内容,所以此命令将抛出您看到的异常。

命令

SqlDataReader.Read()

需要在尝试 GetString 方法之前出现。此外,您应该在执行 GetString 方法之前验证是否已读取数据。

于 2013-01-17T23:18:45.043 回答