5

レポートの実行結果 (Crystal Reports の PDF ファイル) を取得し、それをシリアル化し、varbinary フィールドに貼り付けてから、後で逆シリアル化してユーザーに表示できるようにしたいと考えています。

今のところ、単純な古い ADO .NET (SqlClient、SqlCommand など) を使用する必要があります。

これに落とし穴はありますか?PDFファイルが現在保存されているローカルマシン上のパスを知っているという事実を考慮して、これを達成するための基本的な構文は何ですか?

4

2 に答える 2

5

編集: MSDNのドキュメントで、画像が削除されることがわかりました。VARBINARY(MAX)を使用することをお勧めします。(ねえ、私はそれを知りませんでした)。

私の古い答え:VARBINARYには8KBの制限があります。PDFを保存するには小さすぎる可能性があります。IMAGEデータ型を使用することをお勧めします。

パラメータを使用して、SqlCommandを介してデータを挿入/選択すると、通常のフィールドと同じようにプレーンSQLを使用できます。

画像フィールドに渡すデータはバイトの配列です。

編集2:C#を使用しているため、DataReaderを使用してデータを取得する必要があります。DataReaderを作成するには、SqlCommand.ExecuteReaderのSequentialAccessフラグを使用して、データがメモリに早く読み込まれないようにします。

于 2009-01-14T16:27:07.470 に答える
3

私は本当にbyte[]パラメーターをまったく使用しませんIDbCommand。PDF が 100 Mb の場合はどうなりますか? 私の知る限り、これにより、要求元のブラウザーに結果を送信する前に、データベースからすべての 100 Mb が取得されます (サーバーにその量のメモリが必要です)。ここで、おおよそこのサイズの異なる PDF に対する多数の同時要求を取得することを考えてみてください... 1 秒あたり... これはあまりスケーラブルではありません。

考えられる解決策については、「Blob + Stream = BlobStream」を参照してください。これは、ここオランダの .NET Magazine に数年前に書いた記事です。このメソッドは、SQL Server コマンドを使用して、派生クラスからBLOBの一部にアクセスします。Stream

この記事はオランダ語で書かれていますが、付属のサンプルコードで十分に作業を開始できます。また、Peter De Jonghe が CodeProjectに関する記事をimage書いたようです。この記事は、私の記事を少し拡張し、 SQL Server の列以上のものに一般化しています。この記事は英語です。

これが問題の解決に役立つことを願っています。

于 2009-01-15T07:02:11.137 に答える