- PR -

【ADO.NET】OracleでNullが格納されたDataSetへのアクセス方法

1
投稿者投稿内容
ロンロン
ベテラン
会議室デビュー日: 2004/01/08
投稿数: 58
お住まい・勤務地: TOKYO
投稿日時: 2004-07-06 22:43
こんにちわ。
C# Oracle(MSOLE for Ora) VS.NET2003 で開発しております。


クエリ結果にNULLが存在する場合、
データアダプタでFillした型付データセット(例イ:参照)のデータテーブルのカラムを
下記(例ア:参照)のようなロジックで触ろうとすると、
例外「System.InvalidCastException: 指定されたキャストは有効ではありません。」で落ちてしまいます。

●【例ア:データテーブルのプロパティで値を取得しようとする】
string a = aaaDs.A_TABLE[0].A_NAME; ←(aaaDsには事前にFill済)


●【例イ:AAADataSet.xsd(型付です)】
<xs:element name="A_TABLE">
<xs:complexType>
<xs:sequence>
<xs:element name="A_CD" type="xs:string" />
<xs:element name="A_NAME" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>


●【例ウ:自動生成された型付データセットAAADataSet.cdのA_NAMEのアクセッサ部分です】】
public string A_NAME {
get {
try {
return ((string)(this[this.tableA_TABLE.A_NAMEColumn]));
}
catch (InvalidCastException e) {
throw new StrongTypingException("値は DBNull であるため、取得できません。", e);
}
}
set {
this[this.tableA_TABLE.A_NAMEColumn] = value;
}
}


Nullが格納されているカラムは「A_NAME」に該当します。
自動生成されたソース(例ウ:参照)を見る限り、
nullであってもstringにキャストしようとしているためこの現象が起きていると思われますが、
下記のような回避策(例エ:参照)以外に何か簡単な対処方法はありませんでしょうか?


●【例エ:回避策】
string a = aaaDs.A_TABLE[0].IsA_NAMENull() ? null : aaaDs.A_TABLE[0].A_NAME;


データセットのプロパティ、エレメントのプロパティ等でなにかあれば・・・



よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-07 08:38
引用:

ロンロンさんの書き込み (2004-07-06 22:43) より:


データセットのプロパティ、エレメントのプロパティ等でなにかあれば・・・


 ソリューションエクスプローラに データセット名.xsd というファイルがありますよね。それをダブルクリックします。E-R図が出てきますので、該当するカラムを探します。カラムの左、"E"のさらに左を1回クリックします。プロパティウインドウから、DataSetカテゴリにあるNullValueを探し、値を「(Empty)」にします。そして保存します。

 この状態で自動生成されたソースを見てください。String.Emptyに置き換えが行われるようになっているはずです。
ロンロン
ベテラン
会議室デビュー日: 2004/01/08
投稿数: 58
お住まい・勤務地: TOKYO
投稿日時: 2004-07-07 16:55
>この状態で自動生成されたソースを見てください。
>String.Emptyに置き換えが行われるように
>なっているはずです。

ヌシJitta様ありがとうございます。
String型の項目はおかげさまで対応できました!

ただ、現在datetimeやdecimalの項目も試しておりますが、
こちらはさすがにemptyは無視されてしまうようですね。

minOccursが0に設定されていない項目はfillの時点でNullが来ると落ちてしまったり、
色々デリケートでむづかしいですね。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-08 08:02
引用:

ロンロンさんの書き込み (2004-07-07 16:55) より:

ただ、現在datetimeやdecimalの項目も試しておりますが、
こちらはさすがにemptyは無視されてしまうようですね。


 DateTimeは値型ですから、NULL値はあり得ません。Decimalはどうだったかな?無視されますか?.xsdから.xsd.言語ファイルが作成できずに落ちてしまったと思いますが?
ロンロン
ベテラン
会議室デビュー日: 2004/01/08
投稿数: 58
お住まい・勤務地: TOKYO
投稿日時: 2004-07-08 10:27
>.xsdから.xsd.言語ファイルが作成できずに
>落ちてしまったと思いますが?

まさしくこの通りです。
C#言語ソースが自動生成されずに何事が起きたのかと思いました。
(データセットを使用している他プログラムがコンパイルで怒られまくり)

・・・なので、
stringだとかdatetimeだとかdecimalだとか
各項目ごとの型を意識してnull考慮をしたりしなかったりするのは
一貫性が無いので、
結局型に関係なくnull判断をいれてからデータセットのカラムに触るような
安全プログラムを組むことにしました。
1

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