BASP21を利用して、
buf = Request.BinaryRead(Request.TotalBytes)
rsMail.Fields("lbData") = BASP.FormBinary(buf,"upload")
という形でSQLServer7.0のImage型のフィールドに格納したバイナリがあります。
これをコマンドラインで
BCP "SELECT lbData FROM テーブル名 WHERE … " " queryout " C:\test\ファイル名 -T -f "c:\test\FILE.FMT"
という形でファイルに書き出しました。
すると、PDFやZIP、LZHなどは正しく再生されるのですが、
画像ファイルは「ファイルが破損しているか、大きすぎる可能性があります」となり、
Office文書は文字化けしていて、正しく再生されません。
(ただし、docxファイルは「開いて修復」の機能により正常化)
ちなみに、ASPで
lbData = rs("lbData")
Response.ContentType = "Application/Octet-Stream; name="ファイル名"
Response.AddHeader "Content-Disposition","attachment; filename="ファイル名"
Response.BinaryWrite(lbData)
として開くと、正しく再生できます。
何とかBCPユーティリティーのように
コマンドラインでバイナリからファイルを再生したいと思っています。
上記現象につき、何か思い当たる点はありませんでしょうか。
よろしくお願いいたします。
フォーマットファイル(FILE.FMT)での image 型の指定方法ですが、レコード毎にファイルサイズを指定する必要があるようです。
試しに、以下のコマンドにて1件目のデータ(ファイル)のサイズを確認してみてください。
SELECT TOP 1 DATALENGTH(lbData) FROM テーブル名
もし、1件目のサイズが 10,000 バイトだった場合、フォーマットファイルに
7.0 1 1 SQLIMAGE 0 10000 "" 1 lbData ""
と、記述して、以下の bcp コマンドを実行してみてください。
BCP "SELECT TOP1 lbData FROM テーブル名" queryout C:\test\ファイル名 -T -f "c:\test\FILE.FMT"
10,000 バイトのファイルが出来上がると思います。
以下に複数レコードの対応例が記載されていますので参考にしてみてください。
(SQL Server 2000 の例になっていますので SQL Server 7.0 の場合は「8.0」の箇所を「7.0」に変更してください。)
■ [SQL Server] imageデータをファイルに直接出力する。|Archive Redo Blog http://ameblo.jp/archive-redo-blog/entry-10035872436.html
調査中です
以下のサンプルが参考になるかと思います。
■ ADO Stream オブジェクトを使用して SQL Server の BLOB データへのアクセスおよび変更を行う方法
http://support.microsoft.com/kb/258038
コメントありがとうございます。
回答が遅くなりましたが、取り急ぎフォーマットファイルの内容を提示します。
----------------------
7.0
1
1 SQLIMAGE 4 5131 "" 1 lbData ""
----------------------
サンプルのURLについては、後ほどご報告いたします。
引き続きよろしくお願いいたします。