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
フォーマットファイル(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
>cx20様
返答が遅れて申し訳ありません。
ファイルサイズの指定ですが、コメントに付したフォーマットファイルの
「5131」の部分が、DBに格納されていたファイルサイズです。
(DBにファイル名とファイルサイズがバイナリとともに格納されています)
フォーマットファイルはストアドプロシージャで動的に生成したので、
各ファイルごとにファイルサイズの部分もDBに格納されていた値に
変更されます。
もっとも、もしこれに誤りがあるとしたらお手上げですね…。
ただ、目的の行為はコメントでいただいた参照先のサンプルを
参考にして、ツールを製作することで達成できそうです。
有益な情報をどうもありがとうございました。
>cx20様
返答が遅れて申し訳ありません。
ファイルサイズの指定ですが、コメントに付したフォーマットファイルの
「5131」の部分が、DBに格納されていたファイルサイズです。
(DBにファイル名とファイルサイズがバイナリとともに格納されています)
フォーマットファイルはストアドプロシージャで動的に生成したので、
各ファイルごとにファイルサイズの部分もDBに格納されていた値に
変更されます。
もっとも、もしこれに誤りがあるとしたらお手上げですね…。
ただ、目的の行為はコメントでいただいた参照先のサンプルを
参考にして、ツールを製作することで達成できそうです。
有益な情報をどうもありがとうございました。