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は機能しますが、2番目は表示されません。私はここで何が起こっているのか分かりません(言うまでもなく、私ListBoxは移入されません)。

編集デバッグ中に、読み取り操作の後で、文字列を取得しようとすると、ひどい例外が発生することに気付きました(try-catchブロックを追加しました)。これ以外は読み始めることすらできません

データが存在しない場合の読み取りの試行が無効です。

目を引いた。それでも説明できません。接続は機能します。私がテストしたクエリです。そして、それが何も返さなかったとしても...それはただ何も印刷せずに1つ移動するべきではありませんか?

EDIT2リーダーではなく、メッセージボックスで無効な操作例外が発生したようです。

4

1 に答える 1

1

2番目のメッセージボックスには、メッセージの一部として次のメッセージが表示されます。

SqlDataReader.GetString(1)

データリーダーからまだ何も読み取っていないため、このコマンドは表示されている例外をスローします。

コマンド

SqlDataReader.Read()

GetStringメソッドを試す前に表示する必要があります。さらに、GetStringメソッドを実行する前に、データが読み取られたことを確認する必要があります。

于 2013-01-17T23:18:45.043 に答える