SqlDataReader не возвращает все записи (3-я попытка)
Мы пытались найти решение этой проблемы дважды, но, к сожалению, эти ответы не нашлиЯ обеспечил постоянное исправление, так что вот я, давая ему еще одну попытку.
У меня есть хранимая процедура SQL Server, которая возвращает список из 1,5 миллионов целочисленных идентификаторов. Я вызываю этот SP из кода ASP.NET/VB.NET и выполняю SqlDataReader:
m_dbSel.CommandType = CommandType.StoredProcedure
m_dbSel.CommandText = CstSearch.SQL.SP_RS_SEARCH_EX
oResult = m_dbSel.ExecuteReader(CommandBehavior.CloseConnection)
Затем я передаю этот читатель конструктору классов для создания универсального списка (целочисленного). Код очень простой:
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
Проблема в том, что это неЕсли не прочитать все 1,5 миллиона записей, это число является непоследовательным, окончательное число может составить 500 000 или 1 миллион и т. д. (чаще всего "магия» количество524289 записи возвращаются). Я'мы пытались использоватьCommandBehavior.SequentialAccess
установка при выполнении команды, но результаты также оказались противоречивыми.
Когда я запускаю SP в SSMS, он почти сразу возвращает определенное количество записей и отображает их, но затем продолжает работать еще несколько секунд, пока не будут выполнены все 1,5 миллиона записей - имеет ли это какое-либо отношение к этому?
ОБНОВИТЬ
Через некоторое время я обнаружил, что в очень-очень редких случаях код цикла выше выдает исключение:System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта. в System.Data.SqlClient.SqlDataReader.ReadColumnHeader (Int32 i)
Так что некоторый внутренний сбой действительно случается. Также похоже, что если я заменю
While i_oDataReader.Read
m_aFullIDList.Add(i_oDataReader.GetInt32(0))
End While
который имеет дело с целыми числами с
While i_oDataReader.Read
m_aFullIDList.Add(i_oDataReader(0))
End While
это имеет дело с объектами - кажется, что код работает без сбоев и возвращает все записи.
Пойди разберись.