SqlDataReader no devuelve todos los registros (tercer intento)

He intentado encontrar una solución para este problema dos veces antes, pero desafortunadamente esas respuestas no han proporcionado una solución permanente, así que aquí estoy, dándole otra oportunidad.

Tengo un procedimiento almacenado de SQL Server que devuelve una lista de 1.5 millones de ID de enteros. Estoy llamando a este SP desde el código ASP.NET/VB.NET y ejecutando un SqlDataReader:

m_dbSel.CommandType = CommandType.StoredProcedure
m_dbSel.CommandText = CstSearch.SQL.SP_RS_SEARCH_EX
oResult = m_dbSel.ExecuteReader(CommandBehavior.CloseConnection)

Luego paso ese lector a un constructor de clase para construir una lista genérica (de entero). El código es muy básico:

Public Sub New(i_oDataReader As Data.SqlClient.SqlDataReader)

    m_aFullIDList = New Generic.List(Of Integer)

    While i_oDataReader.Read
        m_aFullIDList.Add(i_oDataReader.GetInt32(0))
    End While

    m_iTotalNumberOfRecords = m_aFullIDList.Count

End Sub

El problema es: esto no lee todos los 1,5 millones de registros, el número es inconsistente, el recuento final podría ser de 500 K o 1 millón, etc. (La mayoría del número "mágico" de524289 los registros se devuelven). He intentado usarCommandBehavior.SequentialAccess configuración al ejecutar el comando, pero los resultados resultaron ser inconsistentes también.

Cuando estoy ejecutando SP en SSMS, devuelve cierto número de registros casi de inmediato y los muestra, pero luego continúa ejecutándose durante unos segundos más hasta que se completan los 1.5 millones de registros. ¿Tiene algo que ver con esto?

ACTUALIZAR

Después de un tiempo descubrí que en muy raras ocasiones el código de bucle anterior produce una excepción:

System.NullReferenceException: referencia de objeto no establecida en una instancia de un objeto. en System.Data.SqlClient.SqlDataReader.ReadColumnHeader (Int32 i)

Así que algún fallo interno sucede. También parece que si sustituyo

While i_oDataReader.Read
  m_aFullIDList.Add(i_oDataReader.GetInt32(0))
End While

que trata en enteros con

While i_oDataReader.Read
   m_aFullIDList.Add(i_oDataReader(0))
End While

que se ocupa de los objetos: el código parece ejecutarse sin problemas y devuelve todos los registros.

Imagínate.

Respuestas a la pregunta(2)

Su respuesta a la pregunta