Access2007で新しく追加されたデータ型の「添付ファイル型」のフィールド。
「添付ファイル型」フィールドは、イメージ、ワークシート ファイル、ドキュメント、グラフ、およびサポートされている
その他の種類のファイルをデータベースのレコードに添付できるという使い方によっては便利なフィールド。
ただこの「添付ファイル型」のフィールドを持ったテーブルをINSERT INTO~なSQLで処理することはできない仕様。
どうやら「添付ファイル型」が複数のファイルデータを格納しているからという理由っぽい。
SQL文のみで対応できないのでVBAのコードによる処理で対応することに。
そこで「添付ファイル型」のフィールド値をウォッチでチェックしてみると・・・「RecordSet2型」と表示されている。
「添付ファイル型」が複数のファイル情報を格納できるのは、それらをレコードとして格納しているからということか。
コピー元のフィールド(RecordSet2型)をコピー先のフィールド(RecordSet2型)にレコード追加して、
各フィールドにデータをセットすることで「添付ファイル型」のコピーは対応できた。
その場合、フィールドのDataUpdatableプロパティがTrueである項目のみ更新することに注意!
例えば”FileTimeStamp”のフィールドは更新する必要が無い
便利なフィールドだけど使用するときには注意しなければ。
以下は、添付ファイル型のフィールドをコピーするVBAのサンプル。
※サンプルコードの環境:Microsoft Access 2007 VBA
'--------------------------------------------------
'概要 : 添付ファイル型データをコピー
'--------------------------------------------------
'引数 : rsFromTbl , I , DAo.Recordset , 待避元の添付ファイル型レコードセット
' : rsToTbl , I , DAo.Recordset , 待避先の添付ファイル型レコードセット
'--------------------------------------------------
'戻り値: 成功 = True 失敗 = False
'--------------------------------------------------
Private Function CopyAttachmentField(ByVal rsFromTbl As DAO.Recordset2, ByVal rsToTbl As DAO.Recordset2) As Boolean
Dim intField As Integer
CopyAttachmentField = False '初期値は失敗
On Error GoTo ERRTRAP
'レコード終了まで処理
Do Until rsFromTbl.EOF = True
rsToTbl.AddNew '待避先に新規追加
'フィールド分のデータをセットする
For intField = 0 To rsFromTbl.Fields.Count - 1
'待避先のフィールドが更新可能な場合
If rsToTbl.Fields(intField).DataUpdatable = True Then
'待避元のデータがNullではない場合
If IsNull(rsFromTbl.Fields(intField).value) = False Then
'待避先に待避元のデータをセットする
rsToTbl.Fields(intField).value = rsFromTbl.Fields(intField).value
End If
End If
Next
rsToTbl.Update '待避先を更新
rsFromTbl.MoveNext
Loop
rsFromTbl.Close
rsToTbl.Close
Set rsFromTbl = Nothing
Set rsToTbl = Nothing
CopyAttachmentField = True 'ここまできたら成功
Exit Function
ERRTRAP:
MsgBox "添付ファイル型データの追加中にエラーが発生しました" & vbCrLf _
& "エラー番号:" & Err.Number & vbCrLf _
& "エラー内容:" & Err.Description & vbCrLf, vbCritical, "予期せぬエラー"
End Function
- Download this code: acvba_copyattachmentfield.txt