QA@IT

SQLServer2008R2のimage型に登録されているパワーポイント画像を取り出したい

3726 PV

お世話になっております。

質問はタイトルの通りなのですが、環境は以下です。

データベース:SQLServer2008R2
開発環境:VB.NET2008 Express

SQLServerのimage型にパワーポイントの画像が登録されています。
この画像はAccessのフォームからOLEを使って登録されているようです。

これをVB.NETから画像ファイルとして取り出したいと思い、下記のコードを
ネットで探して実行してみました。
当方、画像の扱いはほとんど初めてでよくわかっておりませんが、、、

    Using sqlConn As New SqlConnection("接続文字列")
        sqlConn.Open()
        Dim strSQL As String = "select gazou from T_マスタ where 番号=1"
        Using sqlCmd As New SqlCommand(strSQL, sqlConn)
            Using sdr As SqlDataReader = sqlCmd.ExecuteReader
                Do While sdr.Read
                    Dim fs As New FileStream("C:\CLn.ppt", FileMode.CreateNew)
                    Dim bw As New BinaryWriter(fs)
                    bw.Write(CType(sdr.Item(0), Byte()))
                    bw.Close()
                    fs.Close()
                Loop
            End Using
        End Using
        sqlConn.Close()
    End Using

実行すると、ファイルはできるのですが、パワーポイントでは開けないとメッセージが表示
されます。
拡張子判定のフリーのツールを使っても、拡張子が判定できないといわれます。

なにか根本的に間違えているような気がするのですが、ヒントなりともご教示いただけない
でしょうか?

回答

実行すると、ファイルはできるのですが、パワーポイントでは開けないとメッセージが表示
されます。

バイナリファイル比較ツールで、元のファイルと比較するとか。
せめて、ファイルサイズだけでも確認しましょう。

ファイルサイズが頭打ちになっているなら、大きなバイナリデータ(BLOB)を取り出せないとか。

キーワード:ADO.NET BLOB

編集 履歴 (0)
  • アドバイス、ありがとうございます。
    実は客先環境のため、元ファイルの入手が困難だったのですが、
    確かにその通りなので、客先に元ファイルを送ってもらうように
    依頼しました。

    取り出すファイルのサイズはレコードごとに違っているのですが、
    大きなバイナリデータを取り出せないとすると原因はどのあたり
    なのでしょう?

    その線でちょっと調べてみます。
    ありがとうございました。
    -
  • この件、どうやらaccessからOLEオブジェクトとしてDBに登録され
    ているらしく、純粋なパワーポイントのバイナリ情報になに
    やら付加情報がくっついている可能性がでてきました。
    問題が変わってきたので、この質問は解決とさせていただきます。
    ご回答いただいた方にはお礼申し上げます。
    -

ご回答ありがとうございます。

パワーポイントの画像という表現がいまひとつ分からないので
その辺で勘違いをされているのではないでしょうか?

お察しの通り、実際にimage型にどんな形式で画像が登録されているのかが
いまひとつよくわかっていないのが現状です。

Access2003のフォーム上に連結オブジェクトフレームというコントロールを
置いて、そこにパワーポイントのファイルをドラッグ&ドロップで置いて
います。テーブルのimage型に連結されていますので、そのままSQLServerに
パワーポイントのスライドが登録されているようです。
申し訳ありません。なにぶん該当のプログラムの製作者が別会社なもので
詳しいことはこの程度です。

提示のコードでファイルの拡張子をいろいろと変えてみても、結果は同じ
でした。

Dim fs As New FileStream("C:\CLn.ppt", FileMode.CreateNew)
で指定しているファイル名が固定なので上書きされてしまっているのが気になります。

テストコードですので、いちいち生成されたファイルは削除してデバッグしております。

もし、おわかりのことがありましたら、ご教示お願いいたします。

編集 履歴 (0)

パワーポイントの画像という表現がいまひとつ分からないので
その辺で勘違いをされているのではないでしょうか?
パワーポイントのファイルがそのままDBに登録されているなら
提示のようなコードでよいでしょうが画像部分がバイナリ保存されているなら
保存されている内容にあった拡張子でファイル保存する必要があるかと思います。
読込んだバイナリのファイルへの書き込みは提示コードであっていると思います。
ただ

Dim fs As New FileStream("C:\CLn.ppt", FileMode.CreateNew)
で指定しているファイル名が固定なので上書きされてしまっているのが気になります。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。