2013-02-25 56 views
2

我只是學習使用ADO.NET,我似乎有一個問題。我想要做的是從表中獲取數據並將其插入到DataTable.Here是我的代碼:關閉datareader NullReferenceException

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。

我在做什麼錯?

EDIT

我只注意到讀者= cmd.ExecuteReader();拋出一個InvalidOperationException.Is這是因爲查詢?

+0

你的代碼是否到達線路閱讀器= cmd.ExecuteReader();?看起來好像連接或讀取器從來沒有實例化,由於例外。 – Alex 2013-02-25 15:00:10

+0

嘗試使用調試器通過代碼步驟。注意While循環中的第一行,您可能在cmd處得到錯誤。執行這些2行需要更改'categories.Columns.Add(「Id」,typeof (INT)); categories.Columns.Add(「CategoryName」,typeof(int));'你想把它們改爲'cmd.Parameters.AddWithValue(@ CatagoryName,categoryName);' 'cmd.Parameters.AddWithValue(@ Id,categoryId );' – MethodMan 2013-02-25 15:00:47

回答

1

SqlCommand需要訪問SqlConnection對象。例如: -

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

而且,看看在using block - 這是一個更好的方式來組織你的數據訪問代碼。

7

你寫代碼的方式意味着如果在創建或連接到SqlConnection時發生錯誤,你的finally塊將嘗試關閉尚未設置的reader

檢查finally塊中的空值或重新構造代碼。

1

您需要在您檢查null參考finally塊:

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

如果您SqlConnection拋出時connection.Open(),讀者沒有初始化一個例外,它的價值是null,所以你需要檢查它在您的finally區塊。

相關問題