1

이 질문은 다소 my previous one 대답 관련이있다. Generic.List가이 시점에서 더 많은 요소 (예 : 2^19에서 다음^2^20까지)를 수용 할 수 있도록 용량을 변경하면 SqlDataReader가 종료되고 Read 메서드는 더 이상 레코드가없는 것처럼 False를 반환합니다..SqlDataReader.ReadColumnHeader NullReferenceException이

대부분의 경우 조용히 종료되지만 예외는 전혀 발생하지 않습니다. 그러나 때때로 나는 얻을 것 :

NullReferenceException이 { "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."} System.Data.SqlClient.SqlDataReader.ReadColumnHeader에서

(INT32 난을) System.Data.SqlClient.SqlDataReader.GetInt32에서 System.Data.SqlClient.SqlDataReader.ReadColumn (INT32 전, 부울 에서는 setTimeout) (INT32 전)

나는 모든 레코드가 반환하는 사실을 알고에서
다시 저장 프로 시저 사용 ader (단일 열)는 정수 값입니다. 행 m_aFullIDList.Add을 제거하고 간단히 정수 값으로 값을 읽거나 일반 목록 용량을 알고있는 많은 수로 미리 할당 한 경우 -이 문제는 발생하지 않습니다. 분명히 List가 용량을 재 할당 할 때만 발생합니다. 이는 독자에게 영향을줍니다.

또한이 구조체의 용량이 특정 지점을 초과하여 재 할당되는 즉시 다른 구조체 (ArrayList, 심지어 Array, Array.Resize 사용)를 사용하려고 시도했습니다. 이로 인해 SqlDataReader가 손상됩니다.

이 ASP.NET 프로젝트는 다소 복잡하므로 독자를 실행하고 목록으로 읽는 독립 실행 형 프로젝트에서이 문제를 다시 만들려고 할 때 문제가 발생하지 않습니다. 어떤 일이 벌어지고 있으며 이것이 어떻게 수정 될 수 있는지 생각해보십시오.

+1

나는 두 가지 증상 중 하나가 발생하고 있다고 확신합니다. 앱 도메인에 메모리가 부족합니다 ** 또는 ** 리더가 시간 제한을 초과했습니다. –

+0

@neoistheone 신속한 응답에 감사드립니다. 나는 이것에 대해 생각했지만, 연결과 명령 타임 아웃은 SP가 실행하는 것보다 더 큰 값으로 설정된다. (나는 다른 타임 아웃을 놓치고 있는가?) 그리고 나는 많은 기억을 가지고있는 것처럼 보인다 (또한 용량의 사전 할당이 효과가있는 것처럼 보인다) –

답변

0

나는 마침내 그것을 이해했다고 생각합니다.()

Dim oReader as SqlDataReader = GetTheReader() 

FillTheList(oReader) 

기능 GetTheReader 같은 것을 보았다 :

를 목록을 채우기 위해 SqlDataReader 개체를 반환하는 함수를 호출하고 다른 함수에서 그 리더를 사용 -

내 코드의 논리는 2 단계를했다

Function GetTheReader() as SqlDataReader 
    Dim oConn As New SqlConnection("Connection String") : oConn.Open() 
    Dim oComm As New SqlCommand("Stored Procedure", oConn) 

    Dim oReader As SqlDataReader = oComm.ExecuteReader(CommandBehavior.CloseConnection) 

    Return oReader 
End Function 

그것은 함수는 다시 호출자에게 리턴 할 때 범위 나간 로컬 변수로 연결을 열었다. 그리고 Generic List가 채워지는 동안, 다른 Capacity 할당 후 가비지 콜렉션은 오래된 변수를 파기하고 그 연결을 닫음으로써 메모리를 요구했습니다. 유효한 연결이없는 SqlDataReader가 남아있었습니다.

현재 나의 해결책은 GetTheReader 함수 외부에서 연결을 생성하고 매개 변수 중 하나로 전달하는 것입니다.