- PR -

DBNullのdatetime型のデータを取得する場合

1
投稿者投稿内容
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-02-27 14:35
いつも参考にさせていただいております。

VB SQL-SEVER2003 VS.NET2005 で開発しているのですが

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

データテーブルの値を取得
--------------------------------------
Dim ta As New MST_SYSTEM_DataSetTableAdapters.MST_SYSTEMTableAdapter
Dim ads As New MST_SYSTEM_DataSet

ta.Fill(ads.MST_SYSTEM)

Label1.Text = ads.MST_SYSTEM(0).DEL_DATE.ToString()
--------------------------------------
※テーブル[MST_SYSTEM]の[DEL_DATE]はdatetime型です。

自動生成された型付データセットです
--------------------------------------
public System.DateTime DEL_DATE {
get {
try {
return ((System.DateTime)(this[this.tableMST_SYSTEM.DEL_DATEColumn]));
}
catch (System.InvalidCastException e) {
throw new System.Data.StrongTypingException("テーブル \\'MST_SYSTEM\\' にある列 \\'DEL_DATE\\' の値は DBNull です。", e);
}
}
set {
this[this.tableMST_SYSTEM.DEL_DATEColumn] = value;
}
}
--------------------------------------

日付の初期値で設定してあるDBNullをキャストしようとして落ちているようなのですが

IsDBNull(ads.MST_SYSTEM(0).DEL_DATE)
で判断しDBNullの場合は別処理にしようともしましたが
ads.MST_SYSTEM(0).DEL_DATE
この部分を使用すると同じように落ちてしまうようです。

何か対処方法はありませんでしょうか?
よろしくご教授のほどよろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-27 19:49
IsDEL_DATENull ってのが出来ていませんか?
あと、DataSetデザイナでヌルの時の値を設定できたと思う。
_________________
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2007-02-27 22:33
引用:

なんとかさんの書き込み (2007-02-27 14:35) より:

IsDBNull(ads.MST_SYSTEM(0).DEL_DATE)
で判断しDBNullの場合は別処理にしようともしましたが
ads.MST_SYSTEM(0).DEL_DATE
この部分を使用すると同じように落ちてしまうようです。



ここの部分を見てください。
コード:
get { 
try { 
return ((System.DateTime)(this[this.tableMST_SYSTEM.DEL_DATEColumn])); 
} 


System.DateTime 型にキャストしてますよね。
DBNull は DateTime 型にキャストできないため、例外が発生してしまいます。

回避するには Jitta さんの仰るとおり
引用:
IsDEL_DATENull ってのが出来ていませんか?


で出来ると思います。

型付けされているデータセットですので、 IsXXXXNull を使用したほうがいいのですが、一応 IsDBNull でも次のようにしたりすると判定できます。

コード:
IsDBNull(ads.MST_SYSTEM(0).Item("DEL_DATE"))


Item を使用すると Object として扱うことができます。

引用:
あと、DataSetデザイナでヌルの時の値を設定できたと思う。


NullValue プロパティのことですね。
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-02-28 10:01
みなさんご教授ありがとうございました。
上記の2通りとも確認できました。

IsXXXXNullのほうでチェックを行ってから使用することにしたいと思います。

Jittaさんの言われるDataSetデザイナでヌルの時の値を設定と言われるものですが
datetime型だと(Null)や(Enmpty)は設定できず(Throw exception)しか設定できないようです。
string型等はこちらでも対応なのは過去ログで確認しましたが
datetime型は過去ログのほうはなかったようなので質問した次第です。

大変役に立ちました。
みなさんご返答ありがとうございました。
1

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