私は以前にこの問題の解決策を 2 回見つけようとしましたが、残念ながらそれらの回答は永続的な解決策を提供していませんでした。
150 万の整数 ID のリストを返す SQL Server ストアド プロシージャがあります。ASP.NET/VB.NET コードからこの SP を呼び出し、SqlDataReader を実行しています。
m_dbSel.CommandType = CommandType.StoredProcedure
m_dbSel.CommandText = CstSearch.SQL.SP_RS_SEARCH_EX
oResult = m_dbSel.ExecuteReader(CommandBehavior.CloseConnection)
次に、そのリーダーをクラス コンストラクターに渡して、Generic List(Of Integer) を構築します。コードは非常に基本的です。
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
問題は、これが 150 万件のレコードをすべて読み取らないこと、数に一貫性がないこと、最終的なカウントが 500K または 100 万になる可能性があることです (ほとんどの場合、524289レコードの「魔法の」数が返されます)。コマンドの実行時に設定を使用してみましCommandBehavior.SequentialAccess
たが、結果も一貫していませんでした。
SSMS で SP を実行している場合、特定の数のレコードがすぐに返されて表示されますが、150 万件のレコードがすべて完了するまでさらに数秒間実行されます。これとは関係がありますか?
アップデート
しばらくすると、非常にまれに、上記のループ コードが例外をスローすることがわかりました。
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
オブジェクトを扱う - コードは問題なく実行され、すべてのレコードを返します。
図に行きます。