C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 127 を表示中)
■75330 / )  Re[7]: ArrayListとMDBのやりとり
□投稿者/ 魔界の仮面弁士 (237回)-(2015/03/16(Mon) 12:45:38)
2015/03/16(Mon) 12:49:03 編集(投稿者)

No75329 (MP枯渇ウィザード さん) に返信
> 不思議なことに現状の方法だと、SQLcm.CommandTextに(機械が吐いた)00.00.00.というデータが
> temp(4)に入ってくると、それ以降の文字列が連結されず、エラーになってしまうようで、

文字列データ内に ChrW(0) 相当の文字 (vbNullChar) が混入している状態だと想像します。

NULL 文字は、C 言語の文字列終端として使われているため、
たとえば TextBox 等に表示させようとすると、終端判定により
それ以降の文字が切り捨てられるといった現象が起きます。
 Dim S As String = "ABCD" & vbNullChar & "XYZ"
 TextBox1.Text = S

そのような事情から、NULL 文字を含むデータを SQL 文として処理しようとしても、
終端として切り捨てられてしまうため、正常に処理できません。

そのようなデータをデータベース内に書き込むことが本当に適切なのか、
改めて仕様を検討してみてください。

一応、VARCHAR 型のパラメータを経由させるようにすれば、たとえ NULL 文字でも
データベースに書き込むことはできますし、あるいはパラメータ化せずとも、
文字列をヘキサリテラル構文に置き換えて記載すれば、SQL に埋め込むことはできます。

ですが、たとえ NULL 文字を格納できたとしても、他の不可読文字や制御文字なども
正常に扱える保証はありません。そもそも mdb のテキスト型に記録可能な文字種は、
Jet バージョンおよび照合順序設定によって異なっているため、可読文字以外の
混入が予想されるのであれば、データベースに記録する前に、そうした文字を
捨てるか置き換えるかしておく必要があるでしょう。



> SQLcm.CommandText.Replace(" ", "")としても空白が抜けないが
空白に見えていたのは誤解で、実際には空白ではなかったと言うことでしょう。

それにそのコードだと、"Hello World" という文字列が "HelloWorld" になってしまいますよ。

もし、NULL 文字に限らず、「機械が吐いた」というあらゆるデータを保持することが目的なら、
VB 側では「バイナリデータ」としてByte配列で保持することもあわせて検討してみてください。
(機械側の仕様が分からないので、それが可能なのかどうかは分かりませんが)

バイナリをデータベースに保存したい場合、mdb 側としては
可変長の VARBINARY 型と、固定長の BINARY 型が用意されています。
(Microsoft Access のテーブルデザイナでは、これらは「バイナリ」型と表示されます)


> 一応、自動機が吐いたCSVファイルの処理専用ソフトなので、
上記回答で「NULL文字」について言及していますが、それは私の予想でしかありません。
処理されている CSV 内に コード 00 の文字が含まれているかどうかについては、
そのファイルをバイナリエディタで開くなどして確認してみて下さい。
返信 編集キー/


管理者用

- Child Tree -