【テクニカル・上級編】DAO.Database.CreatePropertyを用いた、カスタムデータベースプロパティの保存と取得 – Access VBA解析バイブル

スポンサーリンク

データベースの「魂」を刻む:DAO.Database.CreatePropertyによるメタデータ管理の極致

Access開発において、バージョン管理や設定値をどこに置くかは永遠の課題だ。外部のINIファイルやレジストリ、あるいは専用の管理テーブルに逃がす手法もある。しかし、プロフェッショナルであればこそ、「データベースファイルそのものに情報を埋め込む」という選択肢を極めるべきだ。

DAOの`CreateProperty`メソッド。これは単なるプロパティ操作ではない。Accessという巨大なブラックボックスの「メタデータ層」を直接ハックする行為である。本稿では、この機能を単なる小手先の技で終わらせず、堅牢なシステムアーキテクチャの基盤として昇華させるための知見を共有する。

1. なぜ「カスタムプロパティ」なのか

システム管理において、外部設定ファイルは「削除・改ざん・紛失」のリスクと常に隣り合わせだ。一方、`DAO.Database.Properties`に格納された値は、`.accdb`ファイルという単一のコンテナの一部として物理的に統合される。

  • 単一ソースの原則: データベースをコピー・移動しても、設定情報は追従する。
  • メタデータの不可視化: 一般ユーザーによる不用意な書き換えを防止できる。
  • システム連携: API経由での外部ツールからの参照が極めて容易。

2. 破壊的なエラーを回避する:安全な実装コード

`CreateProperty`は、対象プロパティが存在しない場合にエラーを吐く。これを単なる `On Error Resume Next` で誤魔化すのは三流の所業だ。プロフェッショナルは、確実にオブジェクトの存在を確認し、メモリを制御する。

‘ データベースカスタムプロパティを操作する堅牢なラッパー
Public Sub SetDatabaseProperty(ByVal PropName As String, ByVal PropValue As Variant, Optional ByVal PropType As DAO.DataTypeEnum = dbText)
Dim db As DAO.Database
Dim prp As DAO.Property

Set db = CurrentDb

On Error Resume Next
‘ プロパティへのアクセスを試行
Set prp = db.Properties(PropName)

If Err.Number <> 0 Then
‘ 存在しない場合は新規作成
Set prp = db.CreateProperty(PropName, PropType, PropValue)
db.Properties.Append prp
Else
‘ 存在する場合は更新
prp.Value = PropValue
End If
On Error GoTo 0

‘ 明示的なオブジェクト解放(DAOはリークしやすいため必須)
Set prp = Nothing
Set db = Nothing
End Sub

Public Function GetDatabaseProperty(ByVal PropName As String) As Variant
Dim db As DAO.Database
Dim val As Variant

Set db = CurrentDb
On Error Resume Next
val = db.Properties(PropName).Value
If Err.Number <> 0 Then val = Null
On Error GoTo 0

Set db = Nothing
GetDatabaseProperty = val
End Function

3. シニアエンジニアが意識すべき「メモリと排他」の最適化

オブジェクトのライフサイクル

`CurrentDb` は非常に強力だが、呼び出すたびに新しいインスタンスを生成する可能性がある。大規模システムでは、モジュールレベル変数に保持するか、呼び出し直後に確実に `Nothing` をセットする規律が必要だ。メモリリークは、数ヶ月稼働する常駐型Accessソリューションにおいて致命的なパフォーマンス劣化を招く。

API連携とWindows環境への統合

このプロパティを「最終更新日時」として運用する場合、`GetSystemTime` API等を用いてUTCで保存することを強く推奨する。
ローカルタイムに依存すると、サーバー移行時やタイムゾーンを跨ぐクラウド連携時に必ず破綻する。システム連携の要件があるならば、メタデータは常に標準化せよ。

4. レガシー保守への応用:バージョン管理の自動化

既存のレガシーDBを改修する際、最も怖いのは「今、どのバージョンが動いているのか不明」な状況だ。
システム起動時に `AutoExec` マクロで以下のコードを走らせることを推奨する。

Public Sub SyncVersionInfo()
‘ アプリケーション起動時にDBプロパティを更新
Call SetDatabaseProperty(“Version”, “2.4.1.0”)
Call SetDatabaseProperty(“LastUpdated”, Format(Now, “yyyy/mm/dd hh:nn:ss”))
Call SetDatabaseProperty(“Developer”, “Architect_Team”)
End Sub

これにより、障害発生時に `db.Properties(“Version”)` をチェックするだけで、即座にコードベースの版数が特定できる。これはトラブルシューティングの時間を数時間短縮する「アーキテクトの保険」である。

結論:技術の深淵へ

`CreateProperty` は、Accessの深層心理にアクセスする鍵だ。この手法を使いこなすことで、あなたの開発するシステムは、単なるファイルの集合体から、「自己認識機能を持った自己管理型のアーキテクチャ」へと進化する。

枯れた技術であるAccess VBAだが、その中にはまだ掘り起こされていない「極致」が眠っている。コードを書き捨てず、システムに命を吹き込むこと。それこそが、我々エンジニアに課せられた矜持である。

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