2014-01-13 1 views
3

코드베이스에 눈부신 오류가 있는지 확인하려고합니다.IDataReader를 삭제하지 않으면 연결이 풀로 반환됩니까?

해당 코드는 IDataReader를 반환하는 타사 DLL을 호출합니다. 코드가 처리기없이 처리기를 사용하면 코드가 명시 적으로 풀로 반환되지 않습니다. 맞습니까? 여기

가 호출 코드입니다 : 여기

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; 
      } 
     } 
    } 
} 

usingDispose가 호출되어 있는지 확인합니다.

+2

Michael에게 감사드립니다. 나는 연결의 수가 급격하게 증가한 것을보고 있었는데, 나중에 그 값이 떨어진다. 연결이 수영장으로 돌아가는 데 익숙하지 않은 채로 길게 매달리고 있었다고 생각합니다. – MStodd