Пытаясь запросить SQL Server 2008 из C#, программа, кажется, застряла в бесконечном цикле, который я не могу объяснить

У меня есть база данных SQL Server, и я пытаюсь запросить ее. Сначала я получаю все имена и идентификаторы из таблицы под названием 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 Кажется, я получаю исключение недопустимой операции, не в читателе, но в окне сообщения.

1 ответ

Решение

Во втором окне сообщения вы получите это как часть сообщения:

SqlDataReader.GetString(1)

Поскольку вы еще ничего не прочитали из устройства чтения данных, эта команда выдаст исключение, которое вы видите.

Команда

SqlDataReader.Read()

должен появиться перед попыткой метода GetString. Кроме того, вы должны проверить, что данные были прочитаны перед выполнением метода GetString.

Другие вопросы по тегам