ブログ

Access2016データ型のOLEオブジェクト型を添付ファイルへ一括変更

2017年6月15日 16:14 | ブログ | | 70 views


先日Access2016の添付ファイル型というものを教えていただきました。
添付ファイ型はAccess2007から追加され、OLEオブジェクト型では扱えない画像形式も扱えるようになったようです。

ということで!
すごく興味があったのでフィールドにあるOLEオブジェクト型のBitmapイメージから添付ファイルのJpegイメージに一括変更する処理をPowerShellで書いてみました。

▼ oleConvTfile.ps1

#DB名
$dbPath = "C:\Users\miki\Documents\Database1.accdb"
#テーブル名
$dbTable = "tb1"
#JPG保存先
$imgPath = "C:\Users\miki\Desktop\bmp\b"

#DB接続
$dbe = New-Object -ComObject DAO.DBEngine.120
$db = $dbe.OpenDatabase($dbPath)
$daoRs = $db.OpenRecordSet($dbTable)

#レコードループ
while($daoRS.EOF -eq $false)
{
#OLEオブジェクトサイズ取得
$nSize = $daoRs.Fields("oleObj").FieldSize
#OLEオブジェクトがあれば
if($nSize -ne 0)
{
#バイト配列ヘッダ削除処理
for ($i = 0; $i -lt $nSize; $i++)
{
#OLEオブジェクトのバイト配列取得
$bytImage = $daoRs.Fields("oleObj").GetChunk($i, $nSize)
#メモリストリームに変換
$ms = New-Object System.IO.MemoryStream
$ms.Write($bytImage, 0, $bytImage.Length)

try{
#ビットマップに変換
$bmp = New-Object System.Drawing.Bitmap($ms)
#JPGで保存
$bmp.Save($imgPath + $i +".jpg", [System.Drawing.Imaging.ImageFormat]::Jpeg)

#添付ファイルフィールド
$fld =$daoRs.Fields("tFile").Value
#編集モード
$daoRs.Edit()
#添付ファイルデータがあれば
if ($fld.Fields("FileData").Value.Count -ne 0)
{
#削除
$fld.Delete()
}
#添付ファイル追加
$fld.AddNew()
$fld.Fields("FileData").LoadFromFile($imgPath + $i +".jpg")
$fld.Update()
$fld.Close()
$daoRs.Update()

#バイト配列ヘッダ削除処理を抜ける
break
} catch [ArgumentException]{
#バイト配列ヘッダ削除処理続行
continue
} finally {
#メモリストリームを閉じる
$ms.Close()
}
}
}
#次レコードへ
$daoRs.MoveNext()
}

#DB切断
$db.Close()

#後処理
Remove-Variable dbe,db,fld

PowerShellで試行錯誤しながらプログラミングできてとても楽しかったです!

株式会社システムキューブに在籍していることで、様々な情報をいただけて
「あれもできる!これもできる!こーやってあやったらああなって…」と頭の中で夢が広がっています。