2010-08-12 5 views
1

위의 오류는 데이터베이스에서 수신 한 데이터에서 dataReader.Read를 수행하려고 할 때 발생합니다. 거기에 두 개의 행이 있다는 것을 알고 있으므로 데이터가 실제로 존재하지 않기 때문에 isnt입니다.Reader가 닫힐 때 FieldCount를 호출하지 못했습니다.

문제를 일으키는 CommandBehavior.CloseConnection 일 수 있습니까? ExecuteReader 직후에이 작업을 수행해야한다고 들었습니까? 이 올바른지?

 try 
     { 
      _connection.Open(); 
      using (_connection) 
      { 
       SqlCommand command = new SqlCommand("SELECT * FROM Structure", _connection); 
       SqlDataReader dataReader = command.ExecuteReader(CommandBehavior.CloseConnection); 

       if (dataReader == null) return null; 

       var newData = new List<Structure>(); 
       while (dataReader.Read()) 
       { 
        var entity = new Structure 
        { 
         Id = (int)dataReader["StructureID"], 
         Path = (string)dataReader["Path"], 
         PathLevel = (string)dataReader["PathLevel"], 
         Description = (string)dataReader["Description"] 
        }; 

        newData.Add(entity); 
       } 
       dataReader.Close(); 

       return newData; 
      } 
     } 
     catch (SqlException ex) 
     { 
      AddError(new ErrorModel("An SqlException error has occured whilst trying to return descendants", ErrorHelper.ErrorTypes.Critical, ex)); 
      return null; 
     } 
     catch (Exception ex) 
     { 
      AddError(new ErrorModel("An error has occured whilst trying to return descendants", ErrorHelper.ErrorTypes.Critical, ex)); 
      return null; 
     } 
     finally 
     { 
      _connection.Close(); 
     } 
    } 

미리 도움을 청하십시오.

클레어

답변

1

표시된 코드는 정상입니다. 나는 그것을 시험 프로젝트에 넣었다. 위에 표시된 코드로이 메시지를받는 이유가 즉시 명확하지 않습니다. 다음은 디버깅 팁/제안 사항입니다. 나는 그들이 당신을 위해 귀중하기를 바랍니다.

  • while (dataReader.Read())에 중단 점을 만듭니다. 코드 블록에 들어가기 전에 즉치 또는 조사 창에 dataReader.HasRows을 입력하십시오. 그것은 사실로 평가되어야합니다.

  • Read()에서 멈춘 상태에서 지역 창을 열어 dataReader의 모든 속성을 검사하십시오. FieldCount가 SELECT 문에서 기대하는 값인지 확인하십시오.

  • Read() 반복을 실행하면 학생 개체가 전혀 생성되지 않습니까? 직접 실행 창에서 dataReader["StructureID"]과 다른 모든 값은 무엇입니까?

이 문제의 원인은 CommandBehavior.CloseConnection이 아닙니다. 그것은 단순히 데이터 아더를 닫을 때 연결 자체를 닫도록 지시합니다.

+0

문제가 발생한 것은 CommandBehavior.CloseConnection이 아니었던 것이 옳았습니다. 이것은 진짜 문제를 감추었습니다. 데이터 유형을 잘못된 것으로 변환하려고했습니다. '리더가 닫힐 때 FieldCount를 잘못 호출했습니다.'라는 메시지가 나타나면 코드를 밟았을 때만 나타납니다 (아마도 오랫동안 걸렸기 때문일 수도 있습니다). – ClareBear

1

C#에서 사용 후}를 사용하면 Connection이 자동으로 닫힙니다. 그 이유는 u를 원할 것이므로 u를 읽으려고 할 때 필드 카운트를 닫는 이유입니다. (사용)을 사용하지 않음으로써 수동으로 연결을 열고 닫을 수 있습니다. (사용)

+0

동의. "using (_connection) {"은 데이터 웨어레이터를 "소비"하기 전에 데이터 아더를 닫는 것입니다. "using"을 꺼내서 "CommandBehavior.CloseConnection"을 유지하고 데이터 웨어레이터를 사용한 후에는 .Close()를 호출해야합니다. – granadaCoder

0

오류가 발생하면 명령 대기 시간 문제가 발생합니다. 바이너리 데이터). 첫 번째 시도로서 커맨드 타임 아웃 (연결 타임 아웃이 아닌)을 늘렸고 문제가 해결되었습니다. 참고 : 문제를 찾으려고 시도하는 동안 (Sql) 연결의 StateChanged 이벤트를 수신하려고 시도했지만 연결이 "끊어진"상태에 빠지지 않는 것으로 나타났습니다.