【VB開発】Active Recordパターンとは?DBとオブジェクトを直結する設計概念

Access VBA

はじめに

よくVB関係を触る機会があります。(Officeのシステムを昔から使用しているシステムの保守や修正依頼で)

その際にOBDCを使用し、SQLserverやOracleなどと連携しデータを保管しているのですが、SQLはVB上で書きます。

そしてシステムが大きければ大きいだけ比例するようにSQLが散らばっていきます。まあ、しょうがないことだと思っていますが、、、

それとテーブル定義が変更されるとまた修正が面倒ですが、それらに有効なのがActive Recordパターンとなっています。

Active Recordパターンについて

Active Record(アクティブレコード)パターンは、データベースのテーブルとプログラムのクラスを1対1で対応させる設計方法です。

  • テーブル1つ = クラス1つ
  • レコード1行 = クラスのインスタンス1つ
  • クラス自身が、DB操作のメソッド(SELECT/INSERT/UPDATE/DELETE)を持っている

つまり、「データ」と「そのデータを保存・取得する方法」を同じ場所(クラス)にまとめるのが特徴です。


例えで言うと…

会社の「社員名簿(Employeesテーブル)」を想像してください。

「名簿に新しい社員を追加する」「既存の社員の名前を修正する」といった処理を、名簿そのものが自分でできるイメージです。

・Excelのシート1枚(社員名簿) → クラス(Employee)

・1行ごとの社員情報 → インスタンス(社員オブジェクト)

・「名簿に新しい社員を追加する」「既存の社員の名前を修正する」といった処理を、名簿そのものが自分でできるイメージです。

イメージ

Public Class User
    Public Property Id As Integer
    Public Property Name As String
    Public Property BirthDate As Date

    ' レコード保存
    Public Sub Save()
        Using conn As New SqlClient.SqlConnection("接続文字列")
            conn.Open()
            Dim cmd As New SqlClient.SqlCommand(
                "IF EXISTS (SELECT 1 FROM Users WHERE Id=@Id)
                   UPDATE Users SET Name=@Name, BirthDate=@BirthDate WHERE Id=@Id
                 ELSE
                   INSERT INTO Users (Name, BirthDate) VALUES (@Name, @BirthDate);", conn)
            cmd.Parameters.AddWithValue("@Id", Id)
            cmd.Parameters.AddWithValue("@Name", Name)
            cmd.Parameters.AddWithValue("@BirthDate", BirthDate)
            cmd.ExecuteNonQuery()
        End Using
    End Sub

    ' レコード取得
    Public Shared Function Find(ByVal id As Integer) As User
        Dim u As New User()
        Using conn As New SqlClient.SqlConnection("接続文字列")
            conn.Open()
            Dim cmd As New SqlClient.SqlCommand("SELECT * FROM Users WHERE Id=@Id", conn)
            cmd.Parameters.AddWithValue("@Id", id)
            Dim reader = cmd.ExecuteReader()
            If reader.Read() Then
                u.Id = reader("Id")
                u.Name = reader("Name")
                u.BirthDate = reader("BirthDate")
            End If
        End Using
        Return u
    End Function
End Class

使用

' 新規作成
Dim u As New User() With {
    .Name = "田中太郎",
    .BirthDate = #1990/1/1#
}
u.Save()

' 取得
Dim existing = User.Find(1)
Console.WriteLine(existing.Name)

Active Recordのメリット

  • 直感的:「テーブルの1行 = オブジェクト1つ」というシンプルさ
  • コードがまとまる:SQLがクラス内に整理される
  • 小~中規模では素早く開発できる

デメリット・注意点

  • 大規模では非効率:複雑なJOINや集計には不向き
  • ビジネスロジックが肥大化:クラスが「データ管理+処理ロジック」で太りやすい
  • テストしづらい:DBアクセスが直結しているためモック化が難しい

まとめ

  • Active Recordパターンは テーブルとクラスを1対1で対応させる設計概念
  • VB.NETでも簡単に実装でき、CRUD中心のアプリで有効
  • ただし大規模には不向き → プロジェクトの規模で選択が必要

VB開発でも「ただSQLを書く」から一歩進んで、データをオブジェクトとして扱う設計を意識すると、保守性や再利用性がグッと上がります。

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