none
&H1Bや&H22のDB登録 RRS feed

  • 質問

  • SQLSERVER 2008R2
    開発言語 = vb.2013 pro

    現在VB.netで開発しており、処理を実行する準備として文字連結をさせてる箇所があります。
    以下は例文です
    ①FileData & .YPosition & "," & Chr(&H22)
    ②FileData & Chr(&H1B) & "V" & .YPosition

    上記にある【&H1B】や【&H22】をDBに登録及び、確認をしたいのですが方法が分らず投稿させて頂きます。

    CRLFのような改行コードの場合、
    UPDATE TABLE SET データ3 = N'xxx' + NCHAR(13) + NCHAR(10) + N'yyy'
    上記のようにアスキーコードと登録するテーブルに型に合わせ登録する事は分りました。

    そこで、【&H22】、【&1HB】のアスキーコードを調べるには下記のように記述し、
    Dim c1 As Char = Chr(&H1B)
    Dim code1 As Integer = Asc(c1)
    &H22 = 34
    &1HB = 27
    と取得出来たので、それを登録するにはフィールドの型がnvarcharで設定しているので
    UPDATE TABLE SET データ3 = NCHAR(27)、またはUPDATE TABLE SET データ3 = NCHAR(34)で合っていますか?

    また、DBから取得して今まで通り使用するには下記で実施出来るでしょうか?
    ①FileData & .YPosition & "," & Chr(DBから取得したデータ)


    DBへの登録して試せれば判る事ですが、現在接続できる環境でない為、
    ご教示頂き度、何卒宜しくお願い申し上げます。

    2015年4月17日 1:11

回答

  • UPDATE TABLE SET データ3 = NCHAR(27)、またはUPDATE TABLE SET データ3 = NCHAR(34)で合っていますか?

    SQLServer側で処理を行うのであれば、それで合っています。

    UPDATE [TABLE] SET [データ3] = nchar(0x22) Where...
    UPDATE [TABLE] SET [データ3] = nchar(0x1B) Where...

    のように0xで始めると16進文字列で指定することもできます。
    確認したいのであれば、

    SELECT sys.fn_varbintohexstr(CONVERT(BINARY, [データ3])) AS [16進文字列] FROM [Table]
    のようにSQLを実行すると文字列のバイナリデータを16進文字列として得ることができます。
    また、DBから取得して今まで通り使用するには下記で実施出来るでしょうか?
    ①FileData & .YPosition & "," & Chr(DBから取得したデータ)

    DBの[データ3]列から文字列で取得したのであればChr()に入れるのは間違いでしょう。
    VBのChr関数に数値でなく数字を入れると、自動的に数値に変換したうえで、その数値が表す文字列を得られます。
    "22"という文字列が取得したデータであれば&H1Bに対応する文字が得られるでしょう。

    DBから取得したデータが&H22や&H1Bを含んでいる文字列なら、そのまま連結を行って

    結果 = FileData & .YPosition & "," & DBから取得したデータ

    とすればいいです。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2015年4月17日 9:23
    • 回答としてマーク kong0214 2015年4月17日 9:39
    2015年4月17日 9:20
  • VBからのプログラムであれば、パラメータにしてしまった方がいいかも。

    ※パラメータならSQL上での表現を気にする必要なく文字列をそのまま設定できますし。

    固定の文字列ばかりならいいんですが、そうでもない(FileDataとか.YPositionとかありますね)ならSQLを直に組み立てるのはお勧めしません。

    • 回答としてマーク kong0214 2015年4月17日 9:39
    2015年4月17日 9:32

すべての返信

  • UPDATE TABLE SET データ3 = NCHAR(27)、またはUPDATE TABLE SET データ3 = NCHAR(34)で合っていますか?

    SQLServer側で処理を行うのであれば、それで合っています。

    UPDATE [TABLE] SET [データ3] = nchar(0x22) Where...
    UPDATE [TABLE] SET [データ3] = nchar(0x1B) Where...

    のように0xで始めると16進文字列で指定することもできます。
    確認したいのであれば、

    SELECT sys.fn_varbintohexstr(CONVERT(BINARY, [データ3])) AS [16進文字列] FROM [Table]
    のようにSQLを実行すると文字列のバイナリデータを16進文字列として得ることができます。
    また、DBから取得して今まで通り使用するには下記で実施出来るでしょうか?
    ①FileData & .YPosition & "," & Chr(DBから取得したデータ)

    DBの[データ3]列から文字列で取得したのであればChr()に入れるのは間違いでしょう。
    VBのChr関数に数値でなく数字を入れると、自動的に数値に変換したうえで、その数値が表す文字列を得られます。
    "22"という文字列が取得したデータであれば&H1Bに対応する文字が得られるでしょう。

    DBから取得したデータが&H22や&H1Bを含んでいる文字列なら、そのまま連結を行って

    結果 = FileData & .YPosition & "," & DBから取得したデータ

    とすればいいです。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2015年4月17日 9:23
    • 回答としてマーク kong0214 2015年4月17日 9:39
    2015年4月17日 9:20
  • VBからのプログラムであれば、パラメータにしてしまった方がいいかも。

    ※パラメータならSQL上での表現を気にする必要なく文字列をそのまま設定できますし。

    固定の文字列ばかりならいいんですが、そうでもない(FileDataとか.YPositionとかありますね)ならSQLを直に組み立てるのはお勧めしません。

    • 回答としてマーク kong0214 2015年4月17日 9:39
    2015年4月17日 9:32
  • gekka様

    非常に分りやすくご教示頂きまして誠に有難う御座います。

    今はDBへ接続出来ない環境ですので、確認する事は出来ませんが

    非常に助かりました。

    2015年4月17日 9:41
  • 本筋ではなく、余談かもしれませんが。

    そこで、【&H22】、【&1HB】のアスキーコードを調べるには下記のように記述し、
    Dim c1 As Char = Chr(&H1B)
    Dim code1 As Integer = Asc(c1)
    & H22 = 34
    & 1HB = 27
    と取得出来た

    &H22 や &H1B という定数の時点では単なる数値であり、文字ではありません。(Chr 関数を通すことによって数値に対応した文字を得ることになる)
    文字ではないものから ASCII コードを調べると言うことは論理的にはおかしいということをこの機会に学んでいただければと思います。
    なお、Chr 関数が渡された数値をどのように解釈するかは、このページ に記載があります。(ややこしい話が書いてありますが)

    VB における &H22 や &H1B など、"&H" で始まるものはその続きに書いたものを「16 進数」として扱うという意味なので、&H22 = 34 は単に 16 進数を 10 進数に変えているだけになります。
    (&H22 → 2 * 16 + 2 = 34、&H1B = 1 * 16 + 11 = 27)

    2015年4月17日 13:58
    モデレータ