2

私はちょうど ADO.NET で作業することを学んでいて、問題があるようです。私がやろうとしているのは、テーブルからデータを取得し、それを DataTable に挿入することです。私のコードは次のとおりです。

public DataTable GetCategories()
    {
        SqlConnection connection = null;
        SqlDataReader reader = null;
        DataTable categories = new DataTable();

        try {
            connection = new SqlConnection();
            connection.ConnectionString = connectionString;
            connection.Open();

            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "GetCategories";
            reader = cmd.ExecuteReader();

            categories.Columns.Add("Id", typeof(int));
            categories.Columns.Add("CategoryName", typeof(int));

            while (reader.Read()) {
                int categoryId = (int)reader["Id"];
                string categoryName = (string)reader["CategoryName"];
                categories.Rows.Add(categoryId , categoryName);
            }

        }catch(Exception e){
            DataTable error = new DataTable();
            error.Columns.Add("Error");
            error.Rows.Add(e.Message);
            return error;
        }finally{
            connection.Close();
            reader.Close();
        }
        return categories;
    }

これが私のSQLクエリです:

 CREATE PROCEDURE [dbo].[GetCategories]
    AS
        SELECT Id , CategoryName
        FROM Categories

このメソッドを実行すると、NullRefferenceException という例外が Reader.Close() に戻ります。

私は何を間違っていますか?

編集

reader = cmd.ExecuteReader(); に気付きました。InvalidOperationException をスローします。これはクエリが原因ですか?

4

3 に答える 3

7

コードの書き方は、 の作成または接続でエラーが発生した場合、最終ブロックがまだ設定されていないSqlConnectionを閉じようとすることを意味します。reader

finally ブロックで null 値を確認するか、コードを再構築してください。

于 2013-02-25T14:59:09.633 に答える
1

ブロック内のnull参照を確認する必要があります。finally

    finally{
        connection.Close();
        if (reader != null)
          reader.Close();
    }

SqlConnectionが のときに例外をスローする場合、connection.Open()リーダーは初期化されておらず、その値はnullであるため、ブロックでチェックする必要がありますfinally

于 2013-02-25T15:03:00.597 に答える
1

オブジェクトへのSqlCommandアクセスが必要です。SqlConnection例えば:

SqlCommand cmd = new SqlCommand("dbo.GetCategories", connection)

また、using ブロックを見てください。これは、データ アクセス コードを構造化するためのより良い方法です。

于 2013-02-25T15:03:17.233 に答える