トップ回答者
&H1Bや&H22のDB登録

質問
-
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への登録して試せれば判る事ですが、現在接続できる環境でない為、
ご教示頂き度、何卒宜しくお願い申し上げます。
回答
-
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!)
すべての返信
-
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!)
-
本筋ではなく、余談かもしれませんが。
そこで、【&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)