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

在我运行这个方法的地方,我回到 reader.Close() 一个异常,显示 NullRefferenceException。

我究竟做错了什么?

编辑

我刚刚注意到 reader = cmd.ExecuteReader(); 抛出 InvalidOperationException。这是因为查询吗?

4

3 回答 3

7

您编写代码的方式意味着,如果创建或连接到 时出错SqlConnection,您的 finally 块将尝试关闭reader尚未设置的 a 。

在 finally 块中检查空值或重新构建代码。

于 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 回答