我有一个应用程序,需要从数据库中获取大量数据。由于无法获取所有行(接近200万行...),我将其分成几个部分,每次运行SQL查询并仅获取每次200,000行。
我使用DataTable来输入所有数据(即所有200万行都应该在其中)。
前几次运行正常。然后出现OutOfMemoryException错误。
我的代码工作方式如下:
private static void RunQueryAndAddToDT(string sql, string lastRowID, SqlConnection conn, DataTable dt, int prevRowCount)
{
if (string.IsNullOrEmpty(sql))
{
sql = generateSqlQuery(lastRowID);
}
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
using (IDbCommand cmd2 = conn.CreateCommand())
{
cmd2.CommandType = CommandType.Text;
cmd2.CommandText = sql;
cmd2.CommandTimeout = 0;
using (IDataReader reader = cmd2.ExecuteReader())
{
while (reader.Read())
{
DataRow row = dt.NewRow();
row["RowID"] = reader["RowID"].ToString();
row["MyCol"] = reader["MyCol"].ToString();
... //In one of these rows it returns the exception.
dt.Rows.Add(row);
}
}
}
if (conn != null)
{
conn.Close();
}
if (dt.Rows.Count > prevRowCount)
{
lastRowID = dt.Rows[dt.Rows.Count - 1]["RowID"].ToString();
sql = string.Empty;
RunQueryAndAddToDT(sql, lastRowID, conn, dt, dt.Rows.Count);
}
}
读者似乎一直在收集行,这就是为什么只在第二或第三轮才会引发异常。
难道Using不应该清理内存吗?有什么方法可以解决我的问题吗?
注意:我必须解释-除了将所有行转换为datatable之外,我别无选择,因为我稍后要对它们进行一些操作,而行的顺序很重要,我不能拆分它,因为有时我必须获取某些行的数据并将其设置为一行等等,所以我不能放弃。
谢谢。