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

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

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

Re[3]: DBNullと空文字列の判定を同時に行いたい


(過去ログ 91 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■54403 / inTopicNo.1)  DBNullと空文字列の判定を同時に行いたい
  
□投稿者/ assa (1回)-(2010/10/18(Mon) 17:04:23)

分類:[VB.NET/VB2005 以降] 

お世話になります。

現在VB2010にてDB関連のプログラミングを行っています。
SQL Serverのデータベースを扱っており、DBNullを含んだデータが存在します。またADO.NETとDataSetを利用しています。

そこで質問させて頂きたいのですが、DBNullもしくは空文字列か、それ以外かを一度に判定する事はできますか?

当初

If Convert.ToString(row.列名) <> "") Then
'処理
End If

のような条件文にしたかったのですが、row.列名がDBNullだった場合、この条件文の段階で値を取得しようとして例外が発生してしまいます。

自動生成されるIs列名Null()を使えば良いと思うのですが、なるべく下記のような入れ子にせずに一度に判定できないか調べています。

If Not(row.Is列名Null()) Then
If row.列名.ToString <> "" Then
'処理
End If
End If


なにか良い解決方法や参考資料などがありましたらご教授下さい。
宜しくお願い致します。


引用返信 編集キー/
■54404 / inTopicNo.2)  Re[1]: DBNullと空文字列の判定を同時に行いたい
□投稿者/ 魔界の仮面弁士 (1873回)-(2010/10/18(Mon) 17:07:36)
2010/10/18(Mon) 17:16:52 編集(投稿者)

No54403 (assa さん) に返信
> DBNullもしくは空文字列か、それ以外かを一度に判定する事はできますか?
「DBNull」「空文字列」「その他」の3判定ですか?
それとも「DBNullもしくは空文字列」「その他」の2判定ですか?

後者であれば、
 If (row("列名") & "") = "" Then
で判定できると思います。
引用返信 編集キー/
■54405 / inTopicNo.3)  Re[2]: DBNullと空文字列の判定を同時に行いたい
□投稿者/ assa (2回)-(2010/10/18(Mon) 17:41:06)
No54404 (魔界の仮面弁士 さん) に返信
> ■No54403 (assa さん) に返信
>>DBNullもしくは空文字列か、それ以外かを一度に判定する事はできますか?
> 「DBNull」「空文字列」「その他」の3判定ですか?
> それとも「DBNullもしくは空文字列」「その他」の2判定ですか?
>
> 後者であれば、
>  If (値 & "") = "" Then
> で判定できると思います。

魔界の仮面弁士 さん

早速のご回答有難うございます。
説明不足で申し訳ありません。行いたい判定は「DBNullもしくは空文字列」「その他」の2判定です。

アドバイスを頂いた通り
If (row.列名 & "") = "" Then
にて判定を行ったのですが、判定したい値がプロパティ型の文字列のため、判定時にゲッターを通った時点で例外が発生してしまいました。

'System.InvalidCastException' の初回例外が Microsoft.VisualBasic.dll で発生しました。
System.InvalidCastException: 型 'DBNull' から型 'String' への変換は無効です。

しかし、プロパティを使わずrow("列名")やrow(i)を上記の記述方法で判定したところ、希望通りの結果が得られましたのでこちらの方で参考にさせて頂きたいと思います。


どうも有難うございました。
解決済み
引用返信 編集キー/
■54406 / inTopicNo.4)  Re[3]: DBNullと空文字列の判定を同時に行いたい
□投稿者/ 魔界の仮面弁士 (1874回)-(2010/10/18(Mon) 18:56:14)
2010/10/18(Mon) 18:58:03 編集(投稿者)
# 解決済みチェックつけ直し
-----------------
No54404 (魔界の仮面弁士) の投稿 -(2010/10/18(Mon) 17:07:36)
> 2010/10/18(Mon) 17:16:52 編集(投稿者)
> 後者であれば、
>  If (row("列名") & "") = "" Then
> で判定できると思います。


No54405 (assa さん) に返信 -(2010/10/18(Mon) 17:41:06)
>>後者であれば、
>> If (値 & "") = "" Then
>>で判定できると思います。


済みません、投稿後すぐに再修正をかけたのですが、
サーバービジーに引っかかってしまい、間に合わなかったようです。

> row("列名")やrow(i)を上記の記述方法で判定したところ
意図は読み取っていただけたようですが。



なお、最初の質問に記載しておられた
 If Not(row.Is列名Null()) Then
  If row.列名.ToString <> "" Then
   '処理
  End If
 End If
の場合、「空文字列」では処理されますが、DBNull では処理されていないため、
これでは「DBNullもしくは空文字列」という判定にはなっていません。

2判定にするなら、このようになると思います。
 If row.Is列名Null() OrElse String.IsNullOrEmpty(row.列名) Then
  'DBNullもしくは空文字列
 Else
  'データあり
 End If

> System.InvalidCastException: 型 'DBNull' から型 'String' への変換は無効です。
例外が発生しないようにするため、デザイナー(型付DataSet)の段階で、
各列の[NullValue]プロパティ(≠AllowDBNull プロパティ)を変更しておくという
手法もあります。その列が String 型の場合に限定されますけれども。
解決済み
引用返信 編集キー/
■54407 / inTopicNo.5)  Re[3]: DBNullと空文字列の判定を同時に行いたい
□投稿者/ shu (111回)-(2010/10/18(Mon) 21:24:10)
No54405 (assa さん) に返信

Char(n), NChar(n)対応なら

if row("列名").ToString.Trim = "" then
else
end if

or

if row("列名").ToString.Trim.length = 0 then
else
end if


データセットのデザイナでNullValueの設定をEmptyにするというのもありかも。
解決済み
引用返信 編集キー/
■54441 / inTopicNo.6)  Re[4]: DBNullと空文字列の判定を同時に行いたい
□投稿者/ assa (3回)-(2010/10/20(Wed) 10:01:49)
魔界の仮面弁士さん、shuさん、ご回答有難うございます。
記事を確認するのが遅くなってしまい申し訳ありません。


No54406 (魔界の仮面弁士 さん) に返信
> 2010/10/18(Mon) 18:58:03 編集(投稿者)
> # 解決済みチェックつけ直し
> -----------------


> なお、最初の質問に記載しておられた
>  If Not(row.Is列名Null()) Then
>   If row.列名.ToString <> "" Then
>    '処理
>   End If
>  End If
> の場合、「空文字列」では処理されますが、DBNull では処理されていないため、
> これでは「DBNullもしくは空文字列」という判定にはなっていません。
>
> 2判定にするなら、このようになると思います。
>  If row.Is列名Null() OrElse String.IsNullOrEmpty(row.列名) Then
>   'DBNullもしくは空文字列
>  Else
>   'データあり
>  End If

ご指摘の通り、DBNullではない時の動作を失念しておりました。有難うございます。


>>System.InvalidCastException: 型 'DBNull' から型 'String' への変換は無効です。
> 例外が発生しないようにするため、デザイナー(型付DataSet)の段階で、
> 各列の[NullValue]プロパティ(≠AllowDBNull プロパティ)を変更しておくという
> 手法もあります。その列が String 型の場合に限定されますけれども。

なるほど、デザイナーのプロパティから設定する事ができたのですね。
今まで全列のNullValueプロパティをデフォルトのThrow exceptionにしておりました。
今後はこちらの設定を有効に利用したいと思います。


No54407 (shu さん) に返信
> ■No54405 (assa さん) に返信
>
> Char(n), NChar(n)対応なら
>
> if row("列名").ToString.Trim = "" then
> else
> end if
>
> or
>
> if row("列名").ToString.Trim.length = 0 then
> else
> end if
>
>
> データセットのデザイナでNullValueの設定をEmptyにするというのもありかも。

できればスペースのみのデータも拾いたいと思っていたので、
ご回答頂いたコードで更に希望通りの結果が得られそうです。

NullValueプロパティの設定も別プロジェクトで利用したいと思います。



お二方のお陰で問題を無事解決する事ができました。
どうも有難うございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -