はじめに
よく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を書く」から一歩進んで、データをオブジェクトとして扱う設計を意識すると、保守性や再利用性がグッと上がります。