2011-11-14 29 views
1

我有一個基類,其中包含SqlDataReader它使用存儲過程獲取數據,這很好,直到我返回數據讀取器備份說連接爲null。c#SqlDatareader在我的基類返回空連接錯誤

有沒有人有任何想法?這裏是我的代碼:

public SqlDataReader GetDataReader(string QueryName, SqlParameter[] Params) 
{ 
    SqlConnection conn = new SqlConnection(this.ConnectionString); 
    SqlDataReader reader; 

    using (conn) 
    { 
     SqlCommand command = new SqlCommand(QueryName,conn); 
     command.CommandType = CommandType.StoredProcedure; 

     if(Params !=null) 
      command.Parameters.Add(Params); 

     conn.Open(); 

     reader = command.ExecuteReader();     
    } 

    // conn.Close(); 

    return reader; 
} 

如果你發現,我有註釋掉的密切的一部分,這是我試圖返回DataReader的時候備份它被設置爲接近於得到它的工作,出於某種原因???

謝謝!

+1

很誠實:我會**從不**傳遞一個「打開」的'SqlDataReader' - 這是一個可怕的設計,只是一個災難的祕訣。相反,讓你的方法實際**讀**數據,把它放到'List '中,儘快再次關閉你的'SqlDataReader',然後將該列表返回給調用者... –

+0

如果你有讀者在基類?當然這比複製和粘貼代碼更好的設計,每次你想訪問數據,而不是隻使用低音類中的方法返回一個閱讀器 – Funky

回答

2

你要做到以下幾點:

SqlDataReader dr = command.ExecuteReader(CommandBehavior.CloseConnection) 

,不關閉連接。如果您使用上面的代碼,關閉數據庫時它會爲您關閉它。

+0

哦,和DeveloperX一樣,不要使用'using'語句,因爲你需要連接保持打開狀態直到datareader完成。 –

2

因爲您的連接已關閉並在返回讀取器之前使用了塊。請參閱this SO post

+0

它不是讀者,而是關閉和處置連接。 –

+0

有'使用(conn)'不'使用(讀者)' –

+0

罰款,更新,謝謝。 – Muse

2

使用(conn)塊完成時,它會關閉數據庫連接,這就是爲什麼您會收到該錯誤。只需刪除該行。

2

您正在使用「using」,它與調用conn.Close()具有相同的功能。

2

當您使用using (conn)它自動銷燬conn對象

1

DataReader是一個連接的對象。意味着從DataReader獲取數據,下面的連接需要在那個時候打開。如果您使用在斷開模式下工作的DataSets,情況並非如此。在返回DataReader之前,您正在關閉代碼中的連接。所以DataReader不能給你任何數據。

更好的設計替代方案可能是從外部提供連接(依賴注入)。