3

SQL から DataTable を取得し、それを XML に変換して (SQL XML は使用できません)、ファイルに保存する必要があります。問題は、ファイルが 5 GB になり、すべてをダウンロードしてメモリ内で一度に XML に変換するのに十分なメモリがないことです。DataReader を使用してデータを変換し、チャンクでファイル ストリームにプッシュできるはずですが、実際にこれを行う方法がわかりません。どうすれば次のことができますか?

  1. SQL サーバーに非同期で接続する
  2. ストアド プロシージャを非同期的に呼び出す
  3. DataReader から非同期的にデータを読み取る
  4. データを DataReader から XML に変換し、ファイルに非同期的に保存する

複数のリクエストを処理するサーバー上にあり、それぞれに対してスレッドをブロックすることはできないため、これはすべて非同期である必要があります。

4

3 に答える 3

2

非同期で何かをする必要があるのはなぜですか? これはパフォーマンスが向上する可能性がありますが、はるかに複雑になります。

それを行う簡単な方法:

  • クエリを実行して DataReader を取得する
  • ファイルに書き込む XmlWriter を作成する
  • 行を読み取ってみる
    • 行が残っていない場合は、完了です。(ライター/接続などを閉じていることを確認してください)
    • 行を取得した場合、それを XmlWriter に書き込みます (要素を追加するか、必要なものを追加します)。
  • 前のステップに戻ります。
于 2009-01-22T18:39:32.073 に答える
1

大きな行 (BLOB) がほとんどないか、それとも小さな行がたくさんありますか? 大規模な BLOB の場合、次の 2 つの記事には、C# からストリーミング方式で SQL Server BLOB を処理するために必要なコードが含まれています。

1 つ目は通常の BLOB を処理し、2 つ目は FILESTREAM BLOB を処理します。

多くの小さな行の場合、特別なことは何も必要ありません。リーダーを開いて、XmlWriter へのストリーミングを開始するだけです。非同期にできる唯一の部分は、最初のクエリの実行です。結果が返され始めると、コールバックが完了し、結果の SqlDataReader の読み取りが同期操作になります。これは、結果の読み取りと XML ファイルの書き込みの間、スレッドがブロックされることを意味します。この問題を回避できる ADO.Net API はありません。これが問題を引き起こす可能性があると心配するのは正しいですが (そうなります)、私は尋ねなければなりません: なぜあなたのシステムは XML ファイルへのそのような大規模なダウンロードを行うのですか? 結果をシリアライズして HTTP 応答に戻しますか?

于 2011-07-26T20:59:39.930 に答える
0

必要なのはXmlWriterです

于 2009-01-22T18:39:12.213 に答える