2013-07-31 1 views
0

내가 문자열을 반환하는 함수를 만들고 싶어 값을 반환합니다. 문제는 while() 뒤에 리턴을 넣지 않으면 모든 코드가 값을 반환하지 않는다는 것입니다. 그러나 데이터가 들어있는 변수 lienBaseConnaissance이 필요하며 질문에서 변수가 더 이상 필요하지 않은 값을 가지고 있습니다.DataReader를, 모든 경로는

+2

Offtopic : 'while'루프 안의'return' 문 중 하나가 눌려지면 절대로 cnx.Close()를하지 않을 것입니다. ['using' 블록 안에 'SqlConnection'을 선언하여이 문제를 해결할 수 있습니다 (http://msdn.microsoft.com/en-us/library/yh598w02(v=80) .aspx). – GolfWolf

+1

@ w0lf 그리고 'SqlDataReader'도 마찬가지입니다. 사실, 메서드의 거의 모든 데이터 액세스 개체. – shambulator

답변

3

문제는 while -loop입니다. if이 아니므로 행이 없으면 루프가 입력되지 않을 수도 있습니다.

가장 간단한 해결책은 반환 변수에 기본 값을 할당하는 것입니다 이후

string lienBaseConnaissance = null; 
// .... at the end of the method: 
return lienBaseConnaissance; 

(난 가정)이 단일 값을 읽는 것도 가능합니다 :

if(_ReaderLines.Read()) 
{ 
    if (!_ReaderLines.IsDbNull("ParStrP1")) 
    { 
     lienBaseConnaissance = _ReaderLines.GetString("ParStrP1"); 
     return lienBaseConnaissance; 
    } 
    else 
    { 
     return null; 
    } 
} 
else 
    return null; 

참고using- 문구를 사용하여 관리되지 않는 리소스가 삭제되었는지 확인하십시오 (예 : 연결이 끊어짐). IDisposable을 구현하는 모든 것, 즉 연결, 명령 및 판독기에 사용하십시오.

+0

나는 그것에 대해 생각하고 있었지만 루프를 빠져 나오면 변수 lienBaseConnaissance의 값이 null이되고 데이터가 아닐 것이라고 생각했습니다. 사실 나는 그것을 시도하고 그것을 작동하므로 정말 고마워! –

+0

@HubertSolecki : SP에 대한 정보, SP가 반환하는 정보, 매개 변수 (예 : 기본 키)는 무엇입니까? –

0

_ReaderLines.Read()이 루프의 첫 번째 반복에서 false를 반환하면 while 루프를 입력하지 않기 때문에 반환 값없이 메소드가 빠져 나옵니다.

하지만, 사용을 당신의 의도가 바로 바로 첫 번째 레코드 종료를 읽을 수 있기 때문에 코드는 모든 루프를 필요 reallyn하지 않는, 그래서 변수 lienBaseConnaisance에 기본 값을 할당하는 코드를 변경하는 것이 좋습니다 수 그리고 _ReaderLines.Read()의 방법 -

string lienBaseConnaissance = null; 
    SqlDataReader _ReaderLines = RequeteExiste.ExecuteReader(); 

    if(_ReaderLines.Read()) 
    { 
     if (_ReaderLines["ParStrP1"].ToString() != null) 
      lienBaseConnaissance = _ReaderLines["ParStrP1"].ToString(); 
    } 
    cnx.Close(); 
    return lienBaseConnaissance; 
1

의 끝에서 반환 지점에 떨어질 경우 어떤 때문에, _ReaderLines.Read() false를 반환 한 후 코드 실행 실 거예요 while 루프를 입력 말할 수 있습니다 복귀 경로가 뒤 따른다.

cnx.Close(); 문 다음에 return 문을 추가해야합니다.

뭔가 나는 또한

뭔가 같이도록 SqlConnection에 대한 using Statement보고 권 해드립니다 것이다

public string LienBaseDeConnaissance(string entreprise) 
{ 
    SqlConnection cnx = new SqlConnection("Data Source=SR8-ICARE-SQL;Initial Catalog=db_GENAPI_CM;User Id='IcareReader';Password='$Genapi.Reader1$';"); 
    ... 


    SqlDataReader _ReaderLines = RequeteExiste.ExecuteReader(); 
    while (_ReaderLines.Read()) 
    { 
     if (_ReaderLines["ParStrP1"].ToString() != null) 
     { 
      lienBaseConnaissance = _ReaderLines["ParStrP1"].ToString(); 
      return lienBaseConnaissance; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    cnx.Close(); 
    return null; //this line here 
} 

같은

public string LienBaseDeConnaissance(string entreprise) 
{ 
    using(SqlConnection cnx = new SqlConnection("Data Source=SR8-ICARE-SQL;Initial Catalog=db_GENAPI_CM;User Id='IcareReader';Password='$Genapi.Reader1$';")) 
    { 
     ...  
     SqlDataReader _ReaderLines = RequeteExiste.ExecuteReader(); 
     ... 
    } 
    return null; 
} 
+0

답변 주셔서 감사합니다, 그것에 대해 생각합니다! –

0

첫 번째 줄은 대상 변수를 포함하지 않는 경우, 함수 것 null를 돌려줍니다. 대신 while 루프 이후로 return null을 이동하려고하므로 대상 변수가 전혀 발견되지 않는 경우에만 발생합니다.