【SQLServer7.0】【BASP21】

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ユーティリティーのように
コマンドラインでバイナリからファイルを再生したいと思っています。
上記現象につき、何か思い当たる点はありませんでしょうか。
よろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/09/21 10:45:24
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:cx20 No.2

回答回数607ベストアンサー獲得回数108

ポイント100pt

フォーマットファイル(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
id:j1987

>cx20様

返答が遅れて申し訳ありません。

ファイルサイズの指定ですが、コメントに付したフォーマットファイルの

「5131」の部分が、DBに格納されていたファイルサイズです。

(DBにファイル名とファイルサイズがバイナリとともに格納されています)

フォーマットファイルはストアドプロシージャで動的に生成したので、

各ファイルごとにファイルサイズの部分もDBに格納されていた値に

変更されます。

もっとも、もしこれに誤りがあるとしたらお手上げですね…。

ただ、目的の行為はコメントでいただいた参照先のサンプルを

参考にして、ツールを製作することで達成できそうです。

有益な情報をどうもありがとうございました。

2010/09/21 10:44:29

その他の回答1件)

id:ererdfv No.1

回答回数18ベストアンサー獲得回数0

調査中です

http://q.hatena.ne.jp

id:j1987

他の質問でも同様のことをしているようですね。

2010/09/16 15:56:39
id:cx20 No.2

回答回数607ベストアンサー獲得回数108ここでベストアンサー

ポイント100pt

フォーマットファイル(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
id:j1987

>cx20様

返答が遅れて申し訳ありません。

ファイルサイズの指定ですが、コメントに付したフォーマットファイルの

「5131」の部分が、DBに格納されていたファイルサイズです。

(DBにファイル名とファイルサイズがバイナリとともに格納されています)

フォーマットファイルはストアドプロシージャで動的に生成したので、

各ファイルごとにファイルサイズの部分もDBに格納されていた値に

変更されます。

もっとも、もしこれに誤りがあるとしたらお手上げですね…。

ただ、目的の行為はコメントでいただいた参照先のサンプルを

参考にして、ツールを製作することで達成できそうです。

有益な情報をどうもありがとうございました。

2010/09/21 10:44:29
  • id:cx20
    フォーマットファイル(c:\test\FILE.FMT)の中身を提示して頂けないでしょうか?
  • id:cx20
    あと、単純に、バイナリ型の内容をファイル出力したいということでしたら、
    以下のサンプルが参考になるかと思います。

    ■ ADO Stream オブジェクトを使用して SQL Server の BLOB データへのアクセスおよび変更を行う方法
    http://support.microsoft.com/kb/258038
  • id:j1987
    >cx20様

    コメントありがとうございます。
    回答が遅くなりましたが、取り急ぎフォーマットファイルの内容を提示します。

    ----------------------

    7.0
    1
    1 SQLIMAGE 4 5131 "" 1 lbData ""

    ----------------------

    サンプルのURLについては、後ほどご報告いたします。
    引き続きよろしくお願いいたします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません