掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
TClientDataSetでメモリが足りません (ID:46709)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
お世話になります。 Delphi2007、Windows7、Oracle11g環境で TADOConnection→TADOTable と TSQLConnection→TSQLTable→TDataSetProvider→TClientDataSet を 利用してMS-AccessのテーブルをOracleにコピーするプログラムを作成しています。 下記のプログラムを実行してこれまでは問題なかったのですが、この度フィールド数および レコード数がとても多いテーブルをコピーすることになり、同じように実行したところ、 コピー中に「メモリが足りません」と出るようになりました 下記仕様だとApplyUpdatesが実行されるまでメモリを使い続けると思い、 Self.adoTable.Next; の下の行に10000レコードPostするたびに ApplyUpdatesを実行してみたのですが、これでは改善されませんでした。 ApplyUpdatesを実行しただけではRecordは消えていないため、 メモリが無くなるかと思い、ApplyUpdatesの後にclientDataSetのClose→Openを 追加したらきちんと動きましたが、これが本当に正しい対処かどうか自分には 判断つきませんでした。有識者の方はどのような対処が妥当であるか教えて頂けませんか。 Self.sqlTable.Open; Self.clientDataSet.Open; // 全レコード削除 Self.sqlTable.DeleteRecords; Self.adoTable.Open; Self.adoTable.First; // Accessのテーブルから1レコードずつ取得 while not Self.adoTable.Eof do begin Self.clientDataSet.Append; // 全フィールドのValueをコピー for intCount := 0 to arySFields.Count - 1 do begin Self.clientDataSet.FieldByName(arySFields.Strings[intCount]).Value := Self.adoTable.FieldByName(aryDFields.Strings[intCount]).Value; // ★★★★★ ここに仕掛けを追加してみた end; Self.clientDataSet.Post; Self.adoTable.Next; end; Self.clientDataSet.ApplyUpdates(-1); arySFields.Free; aryDFields.Free; Self.clientDataSet.Close; Self.adoTable.Close; Self.sqlTable.Close; Self.adoConnection.Close; Self.sqlConnection.Close;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.