DB から大量のデータを取得する必要があるアプリケーションがあります。これらの行をすべて取得できなかったため (2,000,000 行に近い...)、分割して分割し、毎回 SQL クエリを実行して、毎回 200,000 行しか取得しませんでした。
すべてのデータを入力する DataTable を使用します (つまり、2,000,000 行すべてが存在する必要があります)。
最初の数回は問題ありません。その後、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);
}
}
リーダーが行を収集し続けているように思えます。そのため、3 回目または 2 回目のラウンドでのみ例外がスローされます。
使用してメモリをきれいにするべきではありませんか?私の問題を解決できるものは何ですか?
注: 説明する必要があります。これらの行をすべてデータテーブルに取得する以外に選択肢はありません。後で操作を行うため、行の順序が重要であり、分割できないことがあります。いくつかの行のデータを取得して1行に設定するなど、あきらめることはできません。
ありがとう。