OdbcCommand.ExecuteReader报OOM

VB.net需要检索数据量较大的表,使用OdbcCommand.ExecuteReader报OOM

        Dim mySqlConnectionAs New OdbcConnection
        Dim mySqlCommand As New OdbcCommand
        Dim mySqlReader As OdbcDataReader

        mySqlCommand.Connection = mySqlConnection
        mySqlCommand.CommandText = "SELECT * FROM MEMBER" 
        mySqlReader = mySqlCommand.ExecuteReader

mySqlCommand.ExecuteReader流式查询,为什么会OOM呢?

在使用ExecuteReader方法时,数据库查询的结果会被缓存到内存中,因此如果查询结果非常大,那么就可能导致内存不足并报告OutOfMemoryException错误。这个问题通常会在处理大量数据时出现。

解决此问题的一种方法是使用ExecuteReader方法的CommandBehavior参数,并将其设置为CommandBehavior.SequentialAccess。这将告诉.NET Framework以流式方式处理结果集,而不是将其全部缓存到内存中。代码如下所示:

mySqlReader = mySqlCommand.ExecuteReader(CommandBehavior.SequentialAccess)

这种方式可以减少内存使用,但是需要在代码中显式地处理结果集,因为在流式处理的情况下,每次只能访问一行数据,而不能像一次性缓存整个结果集那样。因此,需要使用OdbcDataReader的Read方法逐行读取查询结果。例如,可以使用以下代码循环遍历结果集:

While mySqlReader.Read()
    ' 处理当前行数据
End While

如果还是存在内存问题,可以考虑分批查询,即分多个查询语句进行查询,每个查询语句查询一部分数据,这样每次查询的数据量就会减少,从而降低内存使用。