SqlDataReader gibt nicht alle Datensätze zurück (3. Versuch)

Ich habe bereits zweimal versucht, eine Lösung für dieses Problem zu finden, aber diese Antworten haben leider keine dauerhafte Lösung geliefert.

Ich habe eine gespeicherte SQL Server-Prozedur, die eine Liste mit 1,5 Millionen Ganzzahl-IDs zurückgibt. Ich rufe diesen SP aus ASP.NET / VB.NET-Code auf und führe einen SqlDataReader aus:

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

Dann übergebe ich diesen Leser an einen Klassenkonstruktor, um die generische Liste (Of Integer) zu erstellen. Der Code ist sehr einfach:

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

Das Problem ist - dies liest nicht alle 1,5 Millionen Datensätze, die Anzahl ist inkonsistent, die endgültige Anzahl könnte 500.000 oder 1 Million sein usw. (Meistens "magische" Anzahl von524289 Datensätze werden zurückgegeben). Ich habe versucht mitCommandBehavior.SequentialAccess Einstellung beim Ausführen des Befehls, aber die Ergebnisse erwiesen sich auch als inkonsistent.

Wenn ich SP in SSMS ausführe, gibt es eine bestimmte Anzahl von Datensätzen fast sofort zurück und zeigt sie an, läuft dann aber noch einige Sekunden weiter, bis alle 1,5 Millionen Datensätze fertig sind - hat das etwas damit zu tun?

AKTUALISIEREN

Nach einer Weile stellte ich fest, dass der obige Schleifencode in sehr seltenen Fällen eine Ausnahme auslöst:

System.NullReferenceException: Der Objektverweis wurde nicht auf eine Instanz eines Objekts festgelegt. bei System.Data.SqlClient.SqlDataReader.ReadColumnHeader (Int32 i)

Es kommt also zu internen Störungen. Auch sieht es so aus, als würde ich ersetzen

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

das befasst sich mit ganzen Zahlen

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

das sich mit Objekten befasst - der Code scheint fehlerfrei zu laufen und gibt alle Datensätze zurück.

Stelle dir das vor.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage