2014-01-13 18 views
3

我試圖確定代碼庫中是否有明顯的錯誤,或者不是。如果我不處理我的IDataReader,我的連接是否會返回到池中?

有問題的代碼調用第三方DLL返回一個IDataReader。如果代碼在不處理它的情況下使用閱讀器,它將不會顯式返回到池中,對嗎?

下面是調用代碼:

IDataReader rdr = db.ExecSPGetDataReader("dbo.someStoredProcedure", paramList); 
if (rdr.Read()) 
{ 
    List<nameValuePair> formValues = Utils.nameValuePairs(rdr["valuepairs"].ToString()); 
    foreach (nameValuePair nvp in formValues) 
    { 
     if (nvp.name.ToLower() == "name") 
     { 
      outString = nvp.value; 
      break; 
     } 
    } 
} 

這裏的反編譯的第三方DLL的代碼:

public IDataReader ExecSPGetDataReader(string sp, List<param> paramList) 
    { 
     IDataReader dataReader; 
     using (DbCommand dbC = this.setDBCommand(sp, paramList, true)) 
     { 
      IDataReader dr = this._db.ExecuteReader(dbC); 
      this.setOutputParams(dbC, paramList); 
      dataReader = dr; 
     } 
     return dataReader; 
    } 

它看起來像命令得到處理的,可能是用於放置連接的目的,但如果是這樣,那麼如何從返回的IDataReader中讀取任何東西?

+0

是否有必要保留返回的IDataReader的'DbCommand'正確工作? – spender

+1

只是一個側面說明 - 暴露裸露的數據讀取器是一個可怕的設計。我不羨慕你。至少確保在完成數據讀取後處理它們。 –

+0

@spender這是我的問題。我在想,IDataReader掛在數據庫連接上 – MStodd

回答

4

如果代碼使用閱讀器而不處理它,它將不會顯式返回到池中,對嗎?

這是正確的。代碼改成這樣:

using (IDataReader rdr = 
    db.ExecSPGetDataReader("dbo.someStoredProcedure", paramList)) 
{ 
    if (rdr.Read()) 
    { 
     List<nameValuePair> formValues = 
      Utils.nameValuePairs(rdr["valuepairs"].ToString()); 
     foreach (nameValuePair nvp in formValues) 
     { 
      if (nvp.name.ToLower() == "name") 
      { 
       outString = nvp.value; 
       break; 
      } 
     } 
    } 
} 

using聲明將確保Dispose被調用。

+2

謝謝邁克爾。我看到#的連接急劇上升,然後下降。我猜測這些連接只是停留了很長時間,並沒有被用來回到游泳池。 – MStodd

相關問題