.NETで作る!

.NETに関するあれこれ(C#、VB.NET)

DB接続を拡張メソッド&デリゲートで実装する(ver.2015)

DB接続処理(Connection、Transaction)は頻出するので、極力少ないコードで、かつ開閉ミスの内容に実装してみます。*1

Imports System.Runtime.CompilerServices

Public Module IDbConnectionExtension

    <Extension>
    Public Sub Connect(source As IDbConnection, core As Action(Of IDbConnection))
        If source Is Nothing Then Throw New ArgumentNullException("source")
        If core Is Nothing Then Throw New ArgumentNullException("core")
        Try
            source.Open()
            core.Invoke(source)
        Finally
            source.Dispose()
        End Try
    End Sub

    <Extension>
    Public Sub Transact(source As IDbConnection, core As Action(Of IDbTranasction))
        If source Is Nothing Then Throw New ArgumentNullException("source")
        If core Is Nothing Then Throw New ArgumentNullException("core")
        Try
            source.Open()
            Using trn = source.BeginTransaction
                Try
                    core.Invoke(trn)
                    trn.Commit()
                Catch ex As Exception
                    trn.Rollback()
                    Throw
                End Try
            End Using
        Finally
            source.Dispose()
        End Try
    End Sub
End Module

拡張メソッド内で接続処理をして、接続中にメイン処理をコールバックする。それだけ。 使い方はこんな感じ。

Dim cn = New Data.SqlClient.SqlConnection(My.Resources.SQL_SERVER_CNSTRING)
cn.Connect(
    Sub()
        Dim cmd = cn.CreateCommand
        '略
    End Sub)
Dim cn = New Data.SqlClient.SqlConnection(My.Resources.SQL_SERVER_CNSTRING)
cn.Transact(
    Sub(trn)
        Dim cmd = trn.Connection.CreateCommand
        cmd.Transaction = trn
        '略
    End Sub)

接続文字列処理は手を抜いてますので、手を抜かない方法は以下参照。

Unity+app.configでIDbConnectionにインスタンスを注入する - VB.NETで作る!

*1:昔これとほぼ同等のコードを書いてましたが、拡張メソッド化することでより自然に実装

. .