非常に長い質問があります。最近、雇用主から、117個の* .dbfファイルからC#でカスタムDBFからSQLへの移行ユーティリティを作成するタスクが与えられました。各テーブルには、約40〜50列と100行以上があります。(例:プロパティマネジメントデータベース)
私がどのように取り組んでいるのかは次のとおりです。
- dbfファイルをDataTableオブジェクトに変換します。
List<DataTable>
モデルオブジェクトに含まれているにDataTableオブジェクトを追加します。- 列を表示するために、リストをDataGridViewにバインドします。
これはすべて、正常に動作するバックグラウンドワーカーで行われます。
次に行う必要があるのは、ユーザーがこのリストを変換して非常に大きな* .sqlファイルに保存できるようにすることです(または、オプションで、SQL Expressに直接移行することもできます)。繰り返しますが、これはバックグラウンドスレッドで実行しようとします。
これは私が問題にぶつかるところです。DataTableオブジェクトを受け入れて文字列を返すメソッドがあります。その中に、すべての列を「create table」ステートメントに連結し、データを含めるために関連する挿入ステートメントをアタッチするstringbuilderオブジェクトがあります。
List<DataTable>
このメソッドは、モデルオブジェクトに格納されている各DataTableのインスタンスを渡している間、ループで実行されます。
これで、「メモリ不足」例外がスローされる前の4番目または5番目のDataTableまでは正常に機能します。使用していないオブジェクトは必ず開始して破棄します。私は、文字列の連結をすべてstringbuilderの追加ロジックに変更して、stringbuilderのメモリ管理を改善することさえしました。
すべてのオブジェクトの割り当てが解除され、ガベージコレクションが行われることは間違いないので、問題は、モデルオブジェクトのリストに117個のテーブルすべてを格納していることにあると思います。このリストにアクセスする必要があるときはいつでも、モデルオブジェクトへの参照を渡すだけです。DataTablesリストとStringbuilderオブジェクトの組み合わせであるすべてのテーブルのSQLステートメントの作成を開始するとすぐに、メモリが不足します。
私は大学を卒業したばかりなので、業界に不慣れであることを知らせるのを怠っています。私は、最近まで「ベストプラクティス」に従ってプログラミングを行ってきました。ですから、私の質問は皆さんへです。私はこのプロジェクトに間違った方法で取り組んでいますか?それを行うためのより良い方法はありますか?もしそうなら、あなたは私の代わりにあなたが何をするかについていくつかの光を当てるのを手伝ってもらえますか?