SQL Serverのデータベースの中に、bmpやjpgなどの画像ファイルを保存できるの?
その通りだよ。データ型をvarbinary(max)にしたフィールドに、ファイル自体のバイナリデータを書き込むんだ。例えば、C:\temp\1.jpgという画像ファイルが下記のようにあるとするね。
わぁ~。タコさんの絵だ。
下記のような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 'レコードセット変数を閉じる
そうすると、下記のようにレコードが一件追加されるんだ。
これで、さきほどのタコさんの画像がテーブルに保存されたってこと?
その通りだよ。では確認のため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 'ファイルを閉じる
エクスプローラでファイルを確認してみよう。
わぁ~。2.jpgというファイルが作成されて、1.jpgと同じタコさんの絵のファイルがつくられている!!
これで、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
ここで重要なのは、BulkColumnとOPENROWSET(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を利用した便利な販売管理システム(売上仕入在庫管理ソフト)は下記からお申込できます。
コメント