たきるブログ

C#やOracleなどの情報を書いています。

【VB】似非SQLプレースホルダー

スピード重視の製造が必要で、でもビジネスロジック内でSQL書きたくないからめっちゃ簡略的なSQL生成クラス 作った。

リソースからSQLファイル取ってきて、?部分をパラメータ置換するの。
全部文字列だから、シングルクォーテーションとかも設定しなきゃだけど。


Public Class SqlCreator
    Dim pSql As String
    Dim pParams As Dictionary(Of Integer, String) = New Dictionary(Of Integer, String)
    Const PARAMETER_LITERAL_CHARACTER As String = ":?"

    ''' <summary>
    ''' SQL実行準備
    ''' </summary>
    ''' <param name="Sql"></param>
    ''' <param name="Where"></param>
    ''' <returns></returns>
    ''' <remarks>リソースファイルからSQLを取得し、実行準備を行う。</remarks>
    Public Function Prepare(ByVal Sql As String, Optional ByVal Where As List(Of String) = Nothing) As SqlCreator
        'SQLの取得
        pSql = My.Resources.Sql.ResourceManager.GetObject(Sql).ToString()

        'Whereの結合
        If Where Is Nothing Then
            Return Me
        End If
        For Each i As String In Where
            AddWhere(i)
        Next

        Return Me
    End Function

    ''' <summary>
    ''' 抽出条件追加処理
    ''' </summary>
    ''' <param name="Where"></param>
    ''' <returns></returns>
    ''' <remarks>SQL文に、抽出条件を追加する。</remarks>
    Public Function AddWhere(ByVal Where As String) As SqlCreator
        'Whereの結合
        pSql = pSql & My.Resources.Sql.ResourceManager.GetObject(Where).ToString()

        Return Me
    End Function

    ''' <summary>
    ''' パラメータ追加処理
    ''' </summary>
    ''' <param name="Parameter"></param>
    ''' <returns></returns>
    ''' <remarks>SQLのパラメータを追加する。</remarks>
    Public Function Add(ByVal Parameter As String) As SqlCreator
        pParams.Add(pParams.Count, Parameter)

        Return Me
    End Function

    ''' <summary>
    ''' パラメータ置換処理
    ''' </summary>
    ''' <param name="Parameter"></param>
    ''' <returns></returns>
    ''' <remarks>SQLのパラメータを置換する。</remarks>
    Public Function Replace(ByVal Index As Integer, ByVal Parameter As String) As SqlCreator
        If pParams.ContainsKey(Index) Then
            pParams(Index) = Parameter
        End If

        Return Me
    End Function

    ''' <summary>
    ''' パラメータ削除処理
    ''' </summary>
    ''' <param name="index"></param>
    ''' <returns></returns>
    ''' <remarks>対象インデックスのパラメータを削除する。</remarks>
    Public Function Remove(ByVal Index As Integer) As SqlCreator
        pParams.Remove(Index)

        Return Me
    End Function

    ''' <summary>
    ''' パラメータクリア処理
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks>パラメータを全て削除する。</remarks>
    Public Function Clear() As SqlCreator
        pParams.Clear()

        Return Me
    End Function

    ''' <summary>
    ''' SQL取得処理
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks>パラメータが埋め込まれたSQLを取得する。</remarks>
    Public Function GetQuery() As String
        Dim sql As String

        sql = EmbedQuery()

        Return sql
    End Function

    ''' <summary>
    ''' 設定SQL取得処理
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>設定済みのSQLを取得する。</remarks>
    Public ReadOnly Property Sql() As String
        Get
            Return pSql
        End Get
    End Property

    ''' <summary>
    ''' 設定パラメータ取得処理
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>設定済みのパラメータ群を取得する。</remarks>
    Public ReadOnly Property Params() As Dictionary(Of Integer, String)
        Get
            Return pParams
        End Get
    End Property

    ''' <summary>
    ''' パラメータ埋め込み処理
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks>SQLにパラメータを埋め込む。</remarks>
    Private Function EmbedQuery() As String
        Dim sql As String
        Dim pos As Integer

        ' ?をパラメータに置換する
        sql = pSql
        For Each i As KeyValuePair(Of Integer, String) In pParams
            pos = sql.IndexOf(PARAMETER_LITERAL_CHARACTER)
            If pos > 0 Then
                sql = Left(sql, pos) & i.Value & Mid(sql, pos + PARAMETER_LITERAL_CHARACTER.Length + 1)
            End If
        Next

        Return sql
    End Function
End Class