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

スポンサーリンク

Accessの魂をファイルに刻む:DAO.Database.CreatePropertyによる「自己完結型」設定管理の極意

Access開発の現場で、アプリケーションの設定値やバージョン管理をどこに置くか――。外部のINIファイルやレジストリ、あるいは別途作成したテーブルに依存するのは、もはや「素人の所業」と言わざるを得ない。

真に堅牢なシステムは、データベースファイルそのものが自身のメタデータを抱えているべきだ。今回は、DAO(Data Access Objects)の深淵、`CreateProperty`を用いた「カスタムデータベースプロパティ」の掌握術を伝授する。これは、外部ファイルの一切を排除し、環境依存を極限まで減らすための、レガシーを熟知したエンジニアの武器である。

なぜ、カスタムプロパティなのか?

通常、アプリケーション設定を保存するために専用テーブルを作成する者が多い。しかし、テーブルはクエリやフォームの設計変更、あるいはユーザーによる不用意な削除や破損のリスクに晒される。

`CurrentDb.Properties`に刻まれたプロパティは、データベースの「メタデータ領域」に位置する。これはテーブルとは別次元のレイヤーであり、システム管理者が意図的に操作しない限り、外部からは参照・改竄されにくい。バージョン管理、最終同期日時、暗号化キーの断片、あるいはデバッグフラグ――これらをDBファイルと不可分な状態で保持できることは、配布・保守の難易度を劇的に下げる。

鋼鉄のコード:実装のアーキテクチャ

まずは、プロパティの書き込みと読み出しを行うための、極めて汎用性の高いクラスメソッドの一部を紹介する。重要なのは、「プロパティが存在しない場合」のハンドリングと、オブジェクトのメモリ解放(Clean-up)である。

‘ @brief データベースプロパティを設定・更新する
‘ @param PropertyName 設定名
‘ @param Value 設定値
‘ @param PropType データ型 (dbText, dbLong, etc.)
Public Sub SetDatabaseProperty(ByVal PropertyName As String, ByVal Value As Variant, Optional ByVal PropType As Integer = dbText)
Dim db As DAO.Database
Dim prp As DAO.Property

Set db = CurrentDb

On Error Resume Next
‘ プロパティの存在確認(存在しない場合はエラーが発生するため無視)
Set prp = db.Properties(PropertyName)

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

‘ オブジェクトの明示的解放(メモリ管理の鉄則)
Set prp = Nothing
Set db = Nothing
End Sub

極限の知見:メモリとリソースの管理

VBAにおける`CurrentDb`は、呼び出すたびに新しいインスタンスを生成する可能性がある。大規模システムでは、`CurrentDb`を安易にループ内で連呼してはならない。必ず変数に格納し、処理が終了したら即座に`Nothing`を代入してガベージコレクション(あるいは参照カウントのデクリメント)を促すこと。これが、Accessの動作を軽快に保つための「呼吸」だ。

応用:バージョン管理とシステム間連携への展開

この技術の真骨頂は、配布時のバージョンチェックにある。Accessのフロントエンドとバックエンドのバージョン不一致は、開発現場で最も頻発する「悲劇」の一つだ。

‘ @brief 現在のDBバージョンを取得
Public Function GetAppVersion() As String
Dim db As DAO.Database
Set db = CurrentDb

On Error Resume Next
GetAppVersion = db.Properties(“AppVersion”).Value
If Err.Number <> 0 Then GetAppVersion = “0.0.0”

Set db = Nothing
End Function

このようにプロパティを埋め込んでおけば、起動時に以下のチェックを走らせるだけで良い。

1. `AppVersion`を取得。
2. サーバー上のマスタDB(あるいはJSON/XML)のバージョンと比較。
3. 不一致であれば、即座に自動更新スクリプトを起動。

これにより、ユーザーに「バージョンアップしてください」と依頼する手間は消滅する。

シニアエンジニアへの忠告:レガシーの壁

Windows APIを併用してハードウェアIDを組み合わせ、`CreateProperty`に格納した値で「ライセンス認証」を行うことも可能だ。しかし、注意せよ。DAOの`Properties`コレクションは強力だが、一度作成したプロパティは「名前」でのアクセスが主となり、大量のプロパティを詰め込むとカタログ情報の肥大化を招く可能性がある。

あくまで「設定」や「状態」を保持するためのものだ。バイナリデータや巨大なログを保存する場所ではない。適材適所。それがアーキテクトとしての矜持である。

結びに:Accessを「ただのツール」で終わらせない

Access VBAは、現代のモダンな言語と比較すれば制約も多い。だが、その制約こそが、エンジニアの創意工夫を刺激するキャンバスとなる。DAOを極めることは、Accessというブラックボックスの中身を支配することに他ならない。

この記事を読んだ諸君には、ただコードをコピペするだけでなく、その裏にあるオブジェクトの寿命、メモリの呼吸、そしてシステム全体の永続性を常に意識してほしい。

次にシステムに触れるとき、そのDBはただのデータの箱ではなく、あなたの意志が刻まれた「自律的なソフトウェア」になっているはずだ。


Stay hungry, stay professional.

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