VB.NETでヒアドキュメントをlogる

<TestClass()> _
Public Class HereDocumentTest

    <TestMethod()> _
    Public Sub Test1()
        Dim sql As String = <sql>
                                SELECT
                                    C1,
                                    C2,
                                    C3
                                FROM
                                    T1
                            </sql>.Value
        Debug.Print(sql)
    End Sub
End Class


うnix Shell + RDBMS、(よくあるパターンはLinux + Oracle)でShellを
さんざん書いたことがあるヒトなら、コンパイラ言語でヒアドキュメントが
使えないことはとっても不便に思うハズ。

VB.NETで、間接的に使えることが分かったのでlogろうw


間接的にというのは、こういうこと。

System.Xml.Linq.XElement を使うのだ。


XElementは、直接コード中に埋め込むことができるのでbodyを持った1つの要素として、ベタに記述することができる。
面白いw


前述の例はコレを端折って書いていています。

    <TestMethod()> _
    Public Sub Test2()
        Dim xe As XElement = <sql>
                                SELECT
                                    C1,
                                    C2,
                                    C3
                                FROM
                                    T1
                            </sql>
        Debug.Print(xe.Value)
    End Sub

大概のイケてないプロジェクトではこんな状況になっているでしょう...

    <TestMethod()> _
    Public Sub Test3()
        Dim sb As New StringBuilder

        sb.Append("SELECT") _
            .Append(" C1,") _
            .Append(" C2,") _
            .Append(" C3") _
            .Append(" FROM") _
            .Append(" T1")

        Debug.Print(sb.ToString)
    End Sub

このパターンは10年前の実装です。



読めない、書けない、書きたくない...


ORMの導入を検討してあきらめることもあるでしょう...


外だしSQL(ファイル)を検討してあきらめることもあるでしょう...



そんな場合の選択肢の一つかもしれないです。



ちなみに、スクリプトレットを埋め込むことができるで、動的SQLの編集もイケそうです。

    <TestMethod()> _
    Public Sub Test4()
        Dim c1 As Integer = 100
        Dim sql As String = <sql>
                                SELECT
                                    C1,
                                    C2,
                                    C3
                                FROM
                                    T1
                                WHERE
                                    C1 = <%= c1 %>
                            </sql>.Value
        Debug.Print(sql)
    End Sub

Work! Enjoy it!