- hiro
- 会議室デビュー日: 2003/11/04
- 投稿数: 13
|
投稿日時: 2004-01-23 17:47
こんにちわ。質問ですが、あるテーブルの情報を取得して、
変数(今回はstring型)にマッピングする際、もしテーブル内項目に値が入ってない場合は
「型 'DBNull' から型 'String' へのキャストが有効ではありません。"」と怒られます。
もちろん当然なので、今まで私の対処方としては
コード: |
|
dim strID as string
dataReader.Read
if dataReader("ID").GetType.FullName = "System.DBNull" then
strID = ""
else
strID = dataReader("ID")
end if
|
と行っておりました。
しかし、dataReader("ID")の内容をそのまま別のクラスのコンストラクタに
セットしたい場合は、この方法では無理です。
==>やりたいこと。
コード: |
|
'//I責務:Dを保持するクラス
class IDinfo
private ID as string
'コンストラクタ
public sub new(ByVal id As String)
Me.ID = id
end sub
'プロパティ
public property pID as string
get
pID = Me.ID
end get
set(ByVal Value As string)
ID = Value
end set
end property
end class
'//責務:IDinfoクラスにdataReaderから値をセットするクラス
'//
class IDinfoSet
public function CreateTBLCollection(dataReader as IDataReader) as ArrayList
dim IdCollection as ArrayList = new ArrayList()
'//EofまでRead
do until dataReader.Read = False
'=====>>問題個所
Dim sIIDinfo as IDinfo = new IDinfo(dataReader("ID"))
'※の文でdataReader("ID")がNullの場合、DBNULLだと怒られるが、
'なんとかコンストラクタでセットしたい。
'<<=========
IdCollection.Add(sIIDinfo)
loop
'//IDコレクションを返す
return IdCollection
end function
end class
|
というようなことがしたいのですが、、、初心者な質問ですみません。
みなさんどう解決されてますか?? ご教授お願いします。
|
- taku
- ぬし
- 会議室デビュー日: 2002/11/12
- 投稿数: 918
- お住まい・勤務地: 墨田区→中野区
|
投稿日時: 2004-01-23 17:53
SQL関数で読み替えるだけでは?
※通常DBには列の値がnullかどうか判断して、
値を置き換えるSQL関数が用意されています。
|
- NAL-6295
- ぬし
- 会議室デビュー日: 2003/01/26
- 投稿数: 966
- お住まい・勤務地: 東京
|
投稿日時: 2004-01-23 18:10
コード: |
|
'=====>>問題個所
Dim sIIDinfo as IDinfo = new IDinfo(dataReader("ID"))
'※の文でdataReader("ID")がNullの場合、DBNULLだと怒られるが、
'なんとかコンストラクタでセットしたい。
'<<=========
|
は
コード: |
|
Dim sIIDInfo As IDInfo
If TypeOf dataReader("ID") Is DBNull Then
sIIDInfo = New IDinfo("")
Else
sIIDInfo = New IDinfo(dataReader("ID"))
End If
|
もしくは
コード: |
|
Dim sIIDInfo As new IDInfo(IIf(TypeOf dataReader("ID") Is DBNull, "", dataReader("ID") )
|
もしくは
コード: |
|
Dim sIIDInfo As new IDInfo(IIf(dataReader.IsDBNull(項目IDを示すindex), "", dataReader("ID") )
|
では駄目なのでしょうか?
#3つ目の例示に間違いがあったので修正しました。
[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-01-23 18:57 ]
|
- Jitta
- ぬし
- 会議室デビュー日: 2002/07/05
- 投稿数: 6267
- お住まい・勤務地: 兵庫県・海手
|
投稿日時: 2004-01-23 18:15
引用: |
|
NAL-6295さんの書き込み (2004-01-23 18:10) より:
|
IIF関数?!がーん!!if文で5行使ってやっていたのに・・・
|
- hiro
- 会議室デビュー日: 2003/11/04
- 投稿数: 13
|
投稿日時: 2004-01-23 18:38
みなさん、書込みありがとうございました。
NAL-6295さんの方法でやると解決しました。
本当に感謝します。
#IIF関数の存在は知ってたのですが、引数に入れることは
#思いつきませんでした;; もうvb5年もやってるのに。。
また何か有ればぜひよろしくお願いします。
|
- なちゃ
- ぬし
- 会議室デビュー日: 2003/06/11
- 投稿数: 872
|
投稿日時: 2004-01-23 18:43
IIf関数は便利なんですが、Option Strict On で開発してると使いにくいんですね〜
あと、今回では問題ないですが、IIf関数は C# などの3項演算子と異なり、両方の式を評価するので注意が必要だったりします。
# これが原因でInvalidCast〜とかNullReference〜とか…
|
- NAL-6295
- ぬし
- 会議室デビュー日: 2003/01/26
- 投稿数: 966
- お住まい・勤務地: 東京
|
投稿日時: 2004-01-23 18:55
引用: |
|
なちゃさんの書き込み (2004-01-23 18:43) より:
IIf関数は便利なんですが、Option Strict On で開発してると使いにくいんですね〜
あと、今回では問題ないですが、IIf関数は C# などの3項演算子と異なり、両方の式を評価するので注意が必要だったりします。
# これが原因でInvalidCast〜とかNullReference〜とか…
|
フォローありがとうございます。
確かにそうですね。
最初に提示したIFでやる方をお勧めしたいですね。
個人的にはIIFはどちらが評価されてもいい局面でのみ使用するようにしています。
|
- たるたる
- 会議室デビュー日: 2003/09/29
- 投稿数: 16
|
投稿日時: 2004-01-23 21:35
全然はずしているかもしれませんが、
Dim sIIDInfo As new IDInfo(dataReader("ID") & "")
というのは、どうですか?
|