@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

半角SPACEは文字列として認識してくれない!?

投稿者投稿内容
おかぴ
会議室デビュー日: 2003/12/19
投稿数: 7
投稿日時: 2003-12-19 15:29
OleDbDataReaderを使用してのデータのREADでは半角SPACEは
文字列として扱ってくれないのでしょうか?
テーブル名

項目定義
A_A  NOT NULL NUM(2)
B_B  NOT NULL CHAR(20)

と、いうものがあったとします また、データが以下のように登録されているとします。
    A_A  B_B
1件目  1 "ABC"
2件目  2 " " ←半角SAPCEがはいってます
3件目  3 " " ←全角SAPCEがはいってます

この時、1件目が抽出されるようにSELECT文を発行したとします。
で、OleDbDataReaderのREADをかけると
異常終了となります。
そこで、2件目のデータを削除し再びSELECTを発行すると正常に動作します。
そこから以下の疑問点がわきます。
1 半角SPACEは文字列として認識できないのか。
  半角SPACEを文字列として認識するにはマシンに依存する何かが存在するのか?
2 条件式でレコードを特定できているにも関らず他のレコードに
  半角SPACEが入力されている場合、なぜ異常終了となるのか

どなたかおわかりになりますでしょうか??
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2003-12-20 01:03
B_Bに入力しているデータは可変長の文字列のようですが、
CHAR(20) → VARCHAR(20)
では駄目なんですか?もしそうした場合にどうなります?

的外れだったらすいません(System.Data.OleDbは触ったことない)。

あと、環境を書いてください。
TomScissors
ベテラン
会議室デビュー日: 2003/06/05
投稿数: 79
投稿日時: 2003-12-20 09:31
可変長ではなくて固定長ですね。(CHAR(20))
ですから、実際は" "という文字列が入っているわけではありません。

後、質問の際には
・エラーが発生する行と、周辺のコード
・Exceptionの内容
が重要です。
(特に、エラーの場合は"異常終了"の内容は必須ともいえます)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-21 07:31
 固定長だから、' '(半角1つ)というデータだろうが、'(半角20個)' だろうが、ヌルだろうが「同じ」なんですね。それで、そのデータが「ヌルなのかどうか判別できない」というのが1つあるでしょう。

 固定長にする理由は?後でトリムするなら、可変長でも良いのでは??
↑「半角空白20文字の中から半角空白をトリムする方法」を考えなければ!!

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-12-21 07:32 ]
おかぴ
会議室デビュー日: 2003/12/19
投稿数: 7
投稿日時: 2003-12-22 08:57
おはようございます。 レスが遅くなって申し訳ありません。

yaさん、Tomscissorsさん、Jittaさん。 ありがとうございます。
>あと、環境を書いてください。
>周辺のコード等・・・
そーでしたね。。(汗) 下のスレッドを建て直したものだったので
記述を忘れていました。

>ですから、実際は" "という文字列が入っている
>わけではありません(Tomscissorsさんより)

>固定長だから、' '(半角1つ)というデータだろうが、'(半角20個)' だろうが、ヌル
>だろうが「同じ」なんですね。それで、そのデータが「ヌルなのかどうか判別できない」
>というのが1つあるでしょう(Jittaさん)

そーなんですか。チョットいままでの認識が間違っていたようですね。
これまでの仕事で、電文をしようしていて""(NULL)と" "(半角SPACE)・" "(全角SPACE)
とでは、NULLの場合だと電文がくずれるが「半角および全角SPACE」だと電文がくずれることが
なかったので、半角SPACEも文字列として認識できるものと捉えていました。
(ただし、全てSPACEなら桁数分のSPACEが、他の文字の後ろなら残りの桁数分のSPACEが
入っている必要はありますが。)

ありがとうございました。

TomScissors
ベテラン
会議室デビュー日: 2003/06/05
投稿数: 79
投稿日時: 2003-12-22 09:26
話がずれているような気がしますが、
とりあえず半角スペースは文字列として認識できますよ?

OleDbDataReaderに不具合があれば別ですが・・・。
おかぴ
会議室デビュー日: 2003/12/19
投稿数: 7
投稿日時: 2003-12-22 10:41
えっと、GetStringでデータ取得をかけた際に以下のエラーが発生しまして。
>実行時例外がスローされました : System.InvalidOperationException - 行および列にデ>ータが存在しません

その対象となっていたテーブルには半角SPACEが含まれたレコードが存在したのです。
全角SPACEのレコードのみの場合だと正常に取得できています。

で、以下のようなレスがあったので
【OleDbDataReader】では【半角SPACEは文字列として認識しない】と
捉えたわけです。
私の読み違いだったようですね。(汗)


それにしても、マシンAで動作していたものがマシンBでは異常終了するのも
不思議なんですがね・・・
(ちなみにOLEDBのバージョンはAが8.1.6でBが8.1.7と微妙に異なりますが)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-22 11:20
 軽く作って動かしてみました。

環境:
Oracle9i R2 (9.2.0.3)
OleDb 9.2

ソース:
Dim oledb As New Data.OleDb.OleDbCommand("SELECT * FROM TEST_T", _
OleDbConnection1)
Try
OleDbConnection1.Open()
Dim reader As OleDb.OleDbDataReader = oledb.ExecuteReader
While reader.Read
Debug.WriteLine(reader.GetString(1), reader.GetValue(0).ToString)
End While
reader.Close()
Catch ex As Exception
Debug.WriteLine(ex.Message, ex.GetType.ToString)
Finally
OleDbConnection1.Close()
End Try

テーブル:
CREATE TABLE TEST_T (AAA NUMBER, BBB CHAR(20));

データ:
INSERT INTO TEST_T VALUES (1, ' ');
INSERT INTO TEST_T VALUES (2, NULL);

実行結果:
1行目:1:(20個の半角スペース)
2行目:キャストエラー(DbNull.ValueをStringに変換できない)←期待通り


 Oracle Data Providerのリリースノートを読むことをお勧めします。

スキルアップ/キャリアアップ(JOB@IT)