- PR -

データベースから読み出してきたデータがNULLだった場合の対処方についてご相談

1
投稿者投稿内容
カレー落武者
常連さん
会議室デビュー日: 2003/09/12
投稿数: 49
投稿日時: 2003-09-22 10:53
C#でWEBアプリケーションを作成している者です。

データベースから読み出してきたデータを、DataTableオブジェクトに格納し、その1行目の各列のデータを変数に格納するという処理を作っていました。
疑問に思ったのは、データがNULLだった場合、どのように対処するべきか、という事です。

データが文字列型である場合には、ToString()メソッドを使えばNULLだった場合には長さ0の文字列が返されます。例えば、こんな感じで問題無いはずです。

string temp = testTable.Rows[0]["NAME"].ToString();

ただ、データが数値型で、decimal型の変数に格納しようとした場合には、キャスト行わないといけません。その場合、ただキャストをしただけではデータがNULLだった場合に例外が発生します。例えば以下のような処理です。

decimal temp = (decimal)testTable.Rows[0]["ID"];

こんな場合、皆さんならどのように対処しますか?
私が今考えているのは、DBNullと比較して、同一であれば0を格納するように処理を加えようと考えているのですが、どうもゴチャゴチャしてしまい、それが最善の策には思えません。他にもっといい方法がある気がするのです。
どなたか、他に方法をご存知無いでしょうか?それとも、私が考えている方法くらいしか無いのでしょうか?
NYRL
ベテラン
会議室デビュー日: 2003/07/14
投稿数: 90
投稿日時: 2003-09-22 11:11
ぱっと思いつくのは・・・

1.SQLでisNull等で変換しておく
2.if isDbNull で処理分岐
3.as で 変換し変換できたか判断
4.try catchする

こんな感じでしょうか
私は主に1.を使っています。
ちなみに4.はお勧めしません
カレー落武者
常連さん
会議室デビュー日: 2003/09/12
投稿数: 49
投稿日時: 2003-09-22 14:46
NYRLさん、ありがとうございます。

やはり一つ処理を入れるか、SQL文で工夫する必要があるのですね。
ちょっと考えて、やりやすい方法を検討してみます。私の場合、2番が一番やりやすそうですね。

あと、Try〜Catchがお勧めできない理由は何なのでしょうか?ぱっっと思いつかないのですが・・・。他の処理でも結構多用しているので、少し不安です。
NYRL
ベテラン
会議室デビュー日: 2003/07/14
投稿数: 90
投稿日時: 2003-09-22 15:08
try〜catchがお勧めできないのはかなり主観とか好みが入りますが
一番大きいのは私がJavaやってたからかな

.netだとこまかく検証してないのですが少なくてもjavaではtry〜catch は
isnullとかに比べるとコストが大きい処理でした。

そのため避けてきましたが昔の話なので今.net でどうなっているかは
実際図ってみないと正直分からないのですが

スタンスとして想定できる処理に対しては事前に判定等(1.〜 3.)をし
頻度の低い例外処理のみtry〜catchでやるというスタンスです。

[余談]
ちなみにtry〜catchは主にファイルの入出力などでfinallyとセットで使ってます。
[/余談]

でこのようなデータにNULLが入る場合は大体は複数レコードに渡って同様の処理が入るので
SQLで一括で変換したほうが経験上は速かったので1.をお勧めしました。

1

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