2012-11-03 33 views
1

我最一段簡單的VB.NET代碼有一個很奇怪的問題:SqlDataReader的不讀所有記錄

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

    m_aFullIDList = New Generic.List(Of Integer) 

    While i_oDataReader.Read 
     If i_oDataReader.IsDBNull(0) = False Then 
      m_aFullIDList.Add(i_oDataReader.GetInt32(0)) 
     End If 
    End While 

    m_iTotalNumberOfRecords = m_aFullIDList.Count 

End Sub 

基本上過程接受一個DataReader作爲參數,環路直通的所有記錄讀取器,將它們添加到整數的通用列表中。

當讀取器後面的SQL存儲過程返回相對少量的記錄(低於100K)時,讀取器將讀取所有記錄,並且最終計數與結果集匹配。但是當記錄數量超過100萬時 - 結果變得不可預測。

E.g.當我知道SP會回覆1.5M的記錄 - 通用列表中的記錄的最終計數可能是200K,500K等。

任何想法是什麼導致它以及如何解決它?謝謝!

+0

什麼樣的應用程序,ASP.NET或其他多線程類型? –

+0

感謝您的及時迴應。事實上,ASP.NET。 –

+0

在調試時還是僅在生產時是否可重現?什麼是靜態(共享)像連接?你有例外嗎? –

回答

1

它可以幫助使用ExecuteReader overload,允許你指定一個CommandBehavior,並通過CommandBehavior.SequentialAccess因爲這MSDN主題推薦:

Retrieving Large Data (ADO.NET)

+0

已經在使用 ExecuteReader(CommandBehavior.CloseConnection + CommandBehavior.SequentialAccess) 似乎沒有幫助。關於闖入大塊 - 我將如何做到這一點?我不控制SP –

+0

我只看到你是一個:http://stackoverflow.com/a/12464309/284240所以它dos不能正常工作。 –

+0

對不起重複,決定得到一個新的看法。這是一件奇怪的事情 - 它似乎*工作了一段時間,然後沒有更多的效果。不知道爲什麼。 –