Пытаясь запросить 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.