2011-01-24 5 views
0

SQLテーブルのデータを、C#コードの '〜'区切り文字を含むテキストファイルにエクスポートしようとしています。 データが小さい場合はその罰金。それが巨大な場合、メモリ不足の例外がスローされています。テーブルデータをテキストファイルにエクスポートする+ C#+ SQL Server

マイコード:

public static void DataTableToTextFile(DataTable dtToText, string filePath) 
{ 
    int i = 0; 
    StreamWriter sw = null; 

    try 
    { 
     sw = new StreamWriter(filePath, false); /*For ColumnName's */ 
     for (i = 0; i < dtToText.Columns.Count - 1; i++) 
     { 
      sw.Write(dtToText.Columns[i].ColumnName + '~'); 
     } 
     sw.Write(dtToText.Columns[i].ColumnName + '~'); 
     sw.WriteLine(); /*For Data in the Rows*/ 

     foreach (DataRow row in dtToText.Rows) 
     { 
      object[] array = row.ItemArray; 
      for (i = 0; i < array.Length - 1; i++) 
      { 
       sw.Write(array[i].ToString() + '~'); 
      } 
      sw.Write(array[i].ToString() + '~'); 
      sw.WriteLine(); 
     } 
     sw.Close(); 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(""); 
    } 
} 

は、ストアドプロシージャまたはBCPコマンドでこれを行うには良い方法はありますか?

+0

あなたは1000行を書き出して、ファイルを開いていると言ってみましたか? – griegs

+0

巨大なものは?ベール時にレコードセットのサイズはどのくらいですか? – Rob

答えて

1

〜区切り形式を使用するための具体的な理由はありません場合は、例えば、データテーブルでWriteXml機能(http://msdn.microsoft.com/en-us/library/system.data.datatable.writexml.aspx

を使用してみてください: dtToText.WriteXml( "C:\ data.xmlに")

あなたがデータテーブルに戻って、このテキストを変換する必要がある場合

後であなたはReadXmlの説明を使用することができます(http://msdn.microsoft.com/en-us/library/system.data.datatable.readxml.aspx

あなたは本当に既存のコードを機能させるために必要がある場合は、私はおそらく閉鎖を試してみたとのStreamWriterの上disposeの呼び出し間隔を設定してから、再度開いて既存のものに追加するgテキスト。

0

私はこの質問が古くなっていることを認識していますが、私は最近同様の問題を経験しました。解決策:簡単に言えば、Windowsのラージオブジェクトヒープに関する問題が発生していると思います。関連リンク: https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/

は、上記の記事を要約すると:あなたは(あなたのDataTableの値が十分に大きい場合は、あなたのStreamWriterオブジェクト内の舞台裏に発生する可能性が高いと思われる)より85Kロングメモリのチャンクを割り当てると、別のヒープであるラージオブジェクトヒープ(LOH)に移動します。 LOH内のメモリチャンクは、有効期限が切れると正常に割り当てが解除されますが、ヒープは圧縮されません。実質的にメモリがないためではなく、連続したのメモリがある時点でヒープにあるため、System.OutOfMemoryExceptionがスローされます。

System.Runtime.GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; 

:;あなたは(のVisual Studio 2010または前に動作しません、それはVS2012に働くかもしれない)以降の.NETフレームワーク4.5.1またはを使用している場合

、あなたは、このコマンドを使用することができますこのコマンドは、次のガベージコレクションでLOHコンパクションを強制的に実行します。そのコマンドを関数の最初の行に入れてください。この関数が呼び出されるたびにCompactOnceに設定されます。これにより、関数が呼び出された後のある不確定点でLOHコンパクションが発生します。

.NET 4.5.1をお持ちでない場合は、もっと醜いです。問題は、メモリ割り当てが明示的ではないことです。あなたのStreamWriterの中で起こっている可能性が高いです。ガーベージコレクションを強制的に呼び出すGC.Collect()を呼び出してみてください。おそらく、この関数が呼び出されるたびに3回あります。

警告:たくさんの人が、GC.Collect()を直接呼び出すことは悪い考えであり、アプリケーションが遅くなることをアドバイスします。私はこの問題を処理するためのよりよい方法を知らない。

関連する問題