忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

文字列定数(改行、タブ、バックスペース等)について

文字列の一種として、特殊文字の「改行」「タブ」「バックスペース」等をシステム定数として定義されています。
この定義済みの文字列を紹介します。 特殊文字として使うとすれば「復帰」「ラインフィード」「改行」「タブ」「バックスペース」ぐらいでしょうか。

以下の様にシステム定数文字列 vbCr , vbLf , vbNewLine , vbTab , vbBack を使います。 長さが1(復帰のみ2)の文字列として文字列変数にそのまま代入したり連結する形で使えます。 (これらの文字列は Microsoft.VisualBasic.Constants モジュールに定義されています。)
また Microsoft.VisualBasic.ControlChars モジュールにも同じものが定義されていますので、こちらを使うこともできます。

ところで1つはまる点があるのですが、 C#PHP などではダブルクォテーションで文字列を定義した時に 「¥」円マーク(バックスラッシュ)でエスケープ文字として特殊文字を記述できるので VB.NET でも同じ様に記述すると 単なる「¥」と「n」等の文字そのものになります。

■定義済みの文字列定数

    Dim str1 As String
    Dim str2 As String
    Dim str3 As String
    '復帰文字 : &H0D
    str1 = vbCr
    str2 = ControlChars.Cr
    str3 = "\r"             'VB.NET では \ はそのままの文字列でエスケープシーケンスではない!
    Console.WriteLine("vbCr = ControlChars.Cr : " & (str1 = str2) & _
                      "   ControlChars.Cr = ""\r"" : " & (str2 = str3))

    'ラインフィード文字 : &H0A
    str1 = vbLf
    str2 = ControlChars.Lf
    str3 = "\n"
    Console.WriteLine("vbLf = ControlChars.Lf : " & (str1 = str2) & _
                      "   ControlChars.Lf = ""\n"" : " & (str2 = str3))

    '復帰文字とラインフィード文字の組み合わせ : &H0D &H0A
    str1 = vbCrLf
    str2 = ControlChars.CrLf
    str3 = "\r\n"
    Console.WriteLine("vbCrLf = ControlChars.CrLf : " & (str1 = str2) & _
                      "   ControlChars.CrLf = ""\r\n"" : " & (str2 = str3))

    '改行文字(WindowsではvbCrLfと同等)
    str1 = vbNewLine
    str2 = ControlChars.NewLine
    str3 = "\n"
    Console.WriteLine("vbNewLine = ControlChars.NewLine : " & (str1 = str2) & _
                      "   ControlChars.NewLine = ""\n"" : " & (str2 = str3))

    'タブ文字 : &H9
    str1 = vbTab
    str2 = ControlChars.Tab
    str3 = "\t"
    Console.WriteLine("vbTab = ControlChars.Tab : " & (str1 = str2) & _
                      "   ControlChars.Tab = ""\t"" : " & (str2 = str3))

    'バックスペース文字 : &H8
    str1 = vbBack
    str2 = ControlChars.Back
    str3 = "\t"
    Console.WriteLine("vbBack = ControlChars.Back : " & (str1 = str2) & _
                      "   ControlChars.Back = ""\b"" : " & (str2 = str3))

上記のソースの部分のみを実行させた場合に、デバッグ出力ウインドウに以下の様に表示されました。

vbCr = ControlChars.Cr : True   ControlChars.Cr = "\r" : False
vbLf = ControlChars.Lf : True   ControlChars.Lf = "\n" : False
vbCrLf = ControlChars.CrLf : True   ControlChars.CrLf = "\r\n" : False
vbNewLine = ControlChars.NewLine : True   ControlChars.NewLine = "\n" : False
vbTab = ControlChars.Tab : True   ControlChars.Tab = "\t" : False
vbBack = ControlChars.Back : True   ControlChars.Back = "\b" : False

当然なのですが結果から vbCrControlChars.Cr は同じであることがわかります。 (他の文字列も同様です)

■定義済みの文字列定数を使う場面について

上記の定義済みの文字列定数を使えば改行等がソース上に視覚的にはっきりとわかる形で記述できます。
ではどの様な時にこれを使う意味が有るのか。 私の場合、改行文字が必要な場面と言えば、 Oracle 等のデータベースへの SQL 文を作成する場合に使用します。 以下のソースでその例をしめします。生成される SQL 文は例なので意味はありません。

    '接続文字列(これ自身は意味がありません)
    Dim strConnect As String = "Data Source=//*********/test; User ID=test;Password=test;"
    'オラクル接続オブジェクト
    Dim Conn As New OracleConnection(strConnect)
    'オラクル接続オープン
    Conn.Open()

    'SQL文
    Dim strSQL As String = ""
    strSQL &= "SELECT " & vbCrLf
    strSQL &= " TT.伝票番号, TT.伝票日付" & vbCrLf
    strSQL &= "FROM 売上伝票 TT" & vbCrLf
    strSQL &= "WHERE TT.伝票日付 = TO_DATE('2019/11/12')" & vbCrLf
    strSQL &= "ORDER BY TT.伝票番号" & vbCrLf

    'コマンドオブジェクト(SQL文と接続オブジェクト)
    Dim Cmd As New OracleCommand(SQL, Conn)
    Cmd.CommandType = CommandType.Text
    '読込オブジェクトに接続
    Dim dr As OracleDataReader = Cmd.ExecuteReader()
    
    '*** この後はデータ処理... ***

このソースでは SQL 文を SELECT FROM WHERE ORDER BY の各句で改行を入れています。
この改行ですが Oracle SQL 文の解析を行う時に空白文字の様にホワイトスペースとして扱われ、文字列の中では単語の区切りとみなされます。 そのため、この SQL 文では句の区切りとして使用しています。

改行を入れなくても、先頭に1文字空白を入れれば同じことにはなるのですが、テキストとして見ると改行が入った方が見やすい為です。 (先頭に空白を入れ忘れた時のバカ除けでもあります)
実際システムではよく実行 SQL 文のログを残したりしますが、 その時に長い文字列の1行よりも適当に改行が入っていた方が見やすいのです。

■ダブルクォテーションそのものを文字列の中に定義する方法

ダブルクォテーションそのものを文字列の中に宣言したい場合について説明します。 文字列はダブルクォテーションで囲まれていますが、その文字列の中でダブルクォテーションを2回連続して記述します。 (""として記述)

文字列の中にダブルクォテーションを記述する例として思い当たるのは、 上記のソースの SQL 文の中でカラム名とテーブル名が全角になっていますが、 Oracleではこれらをダブルクォテーションで 囲んだ方が安全です。(昔の Oracle ではある全角文字がうまく判定できないことがありました。)
結果として以下の様な記述になります。

    'SQL文
    Dim strSQL As String = ""
    strSQL &= "SELECT " & vbCrLf
    strSQL &= " TT.""伝票番号"", TT.""伝票日付""" & vbCrLf
    strSQL &= "FROM ""売上伝票"" TT" & vbCrLf
    strSQL &= "WHERE TT.""伝票日付"" = TO_DATE('2019/11/12')" & vbCrLf
    strSQL &= "ORDER BY TT.""伝票番号""" & vbCrLf












PR

コメント

コメントを書く