2013-11-04 70 views
1

我已經創建了一個Sql幫助器類,它可以處理我的大部分需求。返回關閉連接的SqlDataReader

當中的,我有一個執行SQL語句和如下返回一個SqlDataReader功能:

public static SqlDataReader ExecuteCommand(string cmdText, bool useParameters) 
{ 
    using (var sqlConnection = new SqlConnection(_connectionString.ConnectionString)) 
    { 
     sqlConnection.Open(); 
     using (var sqlCommand = new SqlCommand(cmdText, sqlConnection)) 
     { 
      if (useParameters && SqlParameterCollection.Count > 0) 
      { 
       sqlCommand.Parameters.AddRange(SqlParameterCollection.ToArray()); 
      } 

      using (var sqlDataReader = sqlCommand.ExecuteReader()) 
      { 
       return sqlDataReader; 
      } 
     } 
    } 
} 

的問題,這是很明顯,事實上,它返回它需要一個打開的連接一個SqlDataReader和連接關閉的事實。

我已經看過要返回一個SqlDataAdapter來代替,但是在閱讀了以下線程SqlDataAdapter vs SqlDataReader之後,它聽起來不像是一個好主意,就像在每個場景中使用的一般函數一樣,當你完全不知道數量時它應該加載的數據。

所以...什麼是好的選擇?

我唯一能想到的就是在SqlDataReader中循環遍歷行並執行yield return IEnumerable<IDataRecord>

有沒有更好的方法來達到這個目標呢?

回答

2

你可以使用CommandBehavior.CloseConnection,可卸下封給調用者 - 這個然後讓你的代碼依賴於呼叫者using讀者正確。

就我個人而言,我會盡量減少這種依賴 - 並將實現代碼儘量靠近DB代碼。事實上,在調用者需要一個原始閱讀器的情況下 - 或者至少不應該有這麼多的情況。我會強烈建議使用諸如「短小精悍」或奧姆斯,讓你可以這樣做:

return connection.Query<T>(cmdText, args).ToList(); 

然後不留下很多地方呼叫者進行亂七八糟的東西。

+0

謝謝,正是我之後。 – cogumel0