スポンサーリンク

SQL Serverのデータベースに画像ファイルを保存する便利な使い方

Accessの使い方
画像ファイルを保存するには
リリ
リリ

SQL Serverのデータベースの中に、bmpやjpgなどの画像ファイルを保存できるの?

SE
SE

その通りだよ。データ型をvarbinary(max)にしたフィールドに、ファイル自体のバイナリデータを書き込むんだ。例えば、C:\temp\1.jpgという画像ファイルが下記のようにあるとするね。

画像 C:\temp\1.jpg
画像 C:\temp\1.jpg
リリ
リリ

わぁ~。タコさんの絵だ。

SE
SE

下記のようなVBAを書いて実行するとテーブルに書き込めるんだ。

OpenステートメントでFor Binaryを利用すると指定したファイルを、バイナリで読み書きできるようになるよ。

Open “C:\temp\1.jpg” For Binary As #1

    On Error Resume Next
    Dim Rs As New ADODB.Recordset
    Dim FileSource() As Byte                    'バイト型の配列を用意
    Dim FileSize As Variant
    
    FileSize = FileLen("C:\temp\1.jpg")         '画像ファイルサイズを取得
    ReDim FileSource(0 To FileSize - 1)         'バイト型の配列をサイズに合わせて宣言しなおす
    Open "C:\temp\1.jpg" For Binary As #1       '画像ファイルをバイナリで開く
    Get #1, , FileSource                        '配列に画像ファイルのバイナリデータを入れる
    Close #1                                    'ファイルを閉じる
        
    Rs.Open "T_商品画像マスタ", CurrentProject.Connection, adOpenDynamic, adLockOptimistic  'テーブルをレコードセット変数に代入

    Rs.AddNew                       'レコードの追加
        Rs!商品画像ID = 1           'IDの代入
        Rs!商品画像 = FileSource    '画像ファイルのバイナリをvarbinary(max)型フィールドに代入
    Rs.Update

    Rs.Close: Set Rs = Nothing      'レコードセット変数を閉じる
SE
SE

そうすると、下記のようにレコードが一件追加されるんだ。

varbinary(max)のレコード追加
varbinary(max)のレコード追加
リリ
リリ

これで、さきほどのタコさんの画像がテーブルに保存されたってこと?

SE
SE

その通りだよ。では確認のため2.jpgという名前でファイルにしてみよう。下記のようなVBAを書いて実行してみるね。また、OpenステートメントでFor Binaryを利用するよ。

    On Error Resume Next
    Dim Rs As New ADODB.Recordset
    Dim FileSource() As Byte                        'バイト型の配列を用意
    Dim FileName As String
    
    Rs.Open "SELECT * FROM T_商品画像マスタ WHERE 商品画像ID = 1", CurrentProject.Connection, adOpenDynamic, adLockOptimistic   '商品画像IDが1のレコードセットを取得

    If Not (Rs.EOF And Rs.BOF) Then
        Rs.MoveFirst
        FileSource = Rs!商品画像                    'バイト型の配列に「商品画像」varbinary(max)型フィールドを代入
    End If

    Rs.Close: Set Rs = Nothing                      'レコードセット変数を閉じる
        
    Open "C:\temp\2.jpg" For Binary As #1           'C:\temp\2.jpgというファイルをオープン
    Put #1, , FileSource                            'バイト配列の内容(「商品画像」)を書き込み
    Close #1                                        'ファイルを閉じる
SE
SE

エクスプローラでファイルを確認してみよう。

画像 C:\temp\2.jpg
画像 C:\temp\2.jpg
リリ
リリ

わぁ~。2.jpgというファイルが作成されて、1.jpgと同じタコさんの絵のファイルがつくられている!!

SE
SE

これで、varbinary(max)のフィールドに、画像ファイルが保存されていることが確認できたね。SQL文でvarbinary(max)に画像ファイルを書き込む方法もあるんだよ。下記のSQL文を実行しても新たに画像ファイルのレコードが追加されるよ。

INSERT INTO T_商品画像マスタ(商品画像ID,商品画像) SELECT 1 AS 商品画像ID,BulkColumn FROM OPENROWSET(BULK N'C:\temp\1.jpg', SINGLE_BLOB) As pic
SE
SE

ここで重要なのは、BulkColumnOPENROWSET(BULK N’C:\temp\1.jpg’, SINGLE_BLOB)だね。OPENROWSET関数で、指定したファイル自体をバイナリで取り出すんだ、そして、その値は、BulkColumnでSQLの中で利用する形になるね。更新だと下記のようになるよ。

UPDATE T_商品画像マスタ SET 商品画像 = BulkColumn FROM OPENROWSET(BULK N'C:\temp\1.jpg', SINGLE_BLOB) As pic WHERE 商品画像ID=1"
リリ
リリ

いろいろやり方があるんだね。

AccessとSQL Serverを利用した便利な販売管理システム(売上仕入在庫管理ソフト)は下記からお申込できます。

売上管理 カスタマイズ対応型 販売管理 複数台同時利用(クラウド)について
インサイトブレイン業務ソフト(カスタマイズ対応型 販売管理ソフト)の複数台同時利用(ネットワーク/クラウド)についての説明です。テレワークにも対応できます。

コメント

タイトルとURLをコピーしました