合理的なNullチェック&空文字セットを行うには?


モモ  2005-09-15 04:48:59  No: 125329

VB.NETです。
次のようなNullチェック用の関数があったとします。
Public Funtion NullCheck (WkData As Object) As Object
    If IsDbNull(WkData) then
        NullCheck = ""
    End  if
End Function
このコードは今ざっと書いたのでおかしい箇所があるとは思いますが、
Nullだった場合、テキストの場合は「""」(空文字列)を
セットするような処理になっていると思います。
この関数を利用する側は、
TextCtl.Text=Me.NullCheck(TextCtl.Text)  ※テキスト項目に限りません
といったような具合になると思います。
そうなるとTextCtl.Textというコードを2度記述しなくては
いけなくなります。
こういった内容の関数を
Me.NullCheck(TextCtl.Text)  
といった形式(1度だけ記述すればよいような形)にしたいのですが。
チェック対象のエリアがかなり多すぎて、2度記述ですと
バグの原因になりそうなので。
上記のコードにこだわらず、”データがNullの場合、該当のエリアに
空文字をセットする”という処理を合理的に行えるような記述方法が
ありましたら教えて下さい。
よろしくお願い致します。


葉月α  2005-09-15 05:18:03  No: 125330

わかりません。ごめんなさい。


いな  2005-09-15 06:22:38  No: 125331

確か、Objectが
TextかComboかといったTypeは拾えたような気がします。

そして、Select Caseで分けて設定を記述していました。


我龍院忠太  2005-09-15 06:58:34  No: 125332

Funtion ウーン! 微妙にスペルがおかしい。(^^;
それとOption Strict Onにしといた方がいいかな。

>Nullだった場合、テキストの場合は「""」(空文字列)を
DBNullとNullは別物、それともともとVB.NETにはNullはないし。。。

>TextCtl.Text=Me.NullCheck(TextCtl.Text)
TextCtl.Textに何が入ったら、空文字にしたいのだろうか。


モモ  2005-09-15 07:30:37  No: 125333

適当なご質問で申し訳ございません。
特にデータセットの中身がDBNullの場合、
空文字をセットするような感じです。
そもそもTextCtl.TextにNullのようなデータが入ることは
考えられないのでしょうか。
String型でNull値は受けられないからダメなんでしょうね。
話は戻りまして、表題のような処理を実現できるような関数を
出来るだけスマートなコードで記述したいので
お知恵を貸して頂けないでしょうか…
よろしくお願い致します。
追伸
スペルミス他、すみません。


id_rsa+  2005-09-15 12:56:40  No: 125334

vb6もそうだけど、VB.NETでもNULLに空文字列を足すと空文字列になるっぽいね・・・

Dim Value As DBNull
    MsgBox("".Equals(Value))       ・・・False
    MsgBox("".Equals(Value + ""))  ・・・True


我龍院忠太  2005-09-15 17:45:00  No: 125335

先ず整理しておかなければならない点は、
>TextCtl.Text=Me.NullCheck(TextCtl.Text)
の場合は、チェックしようとする値が、既にTextBoxに入れられる段階で、
String型に変換されているか、又はString型であることがチェックされています。
つまりTextデーターとしてDbNulが入っていることは無いのです。
TextCtl.Text=Me.NullCheck(TextCtl.Text)で何かをチェックすると仮定すると
それはテキストボックスに入っている文字列が、適切か否かをチェックすること
になります。(たとえば数字を期待しているが、アルファベットが入っていないかどうか等)
質問の内容からして多分それは意図していないでしょう。
となるとチェックは、オブジェクトがテキストボックスに入れることの出来るString型か
否かになります、そうなると
TextCtl.Text=Me.NullCheck(TextCtl.Text)この構文はなくなり
TextCtl.Text=Me.NullCheck(Object)となります。
こうなるとTextCtl.Textの反復は無くなり、質問自体が成立しません。
たとえば
Dim MyVar As Object
MyVar = System.DBNull.Value
として、このMyVarのチェックをしようとした場合あ
TextCtl.Text=Me.NullCheck(MyVar)  
となり構文はこれ以上簡単にはなりませんよね。


葉月α  2005-09-15 18:04:02  No: 125336

どこの誰か知りませんが・・・

わかりませんと答えているのは私じゃないです
あぁ・・・何自分自身を弁護してるんだ・・・

ちゅか、わからないなら答えるなよ

葉月という名前に別人現れたからαつけて区別してきたのに
とても意図的なものを感じてムカツクのですが

ちなみに2005/09/14(水) 20:18:03は電車で移動中(帰宅中)です


ちる  2005-09-15 22:53:47  No: 125337

皆様はじめまして。ちると申します。環境はVB.Net2003です。
以後、お見知りおきをお願いいたします。

現在Access2000に対しての問い合わせをしていまして、同じような
内容にて悩んでおりましたので、書き込みさせていただきます。
スレッドを立て直したほうがよろしければそのようにご指摘下さい。

DBの各カラムの値を配列に代入して、各カラム内容を加工しその後
アップデートするといった場合にカラムの数だけ要素がある配列を
作り、一つずつ代入しています。
このときカラムの中身がNullの場合エラーが出ますので、モモさん
のおっしゃるようなことをしてエラーを回避しています。
そうすると、カラムの数だけIF文が繰り返されるのですが、スマー
トに配列の要素の内容すべてをチェックできるような方法は無いで
しょうか。

モモさんの最初の発言にIsDbNullがありましたので同じような事を
されているのかなと思いました。

宜しくお願いします。


我龍院忠太  2005-09-16 01:21:01  No: 125338

>スレッドを立て直したほうがよろしければそのようにご指摘下さい。
はい出来れば別の方が良いです、別の人が同じスレッドで質問すると
解決をつけることが出来なくなります。
この質問に関連しているなら、リンクを張っておくことです。


medaka  2005-09-16 02:09:31  No: 125339

DBからの読む時は
datareader.itemとかdatatable.datarow.item のオブジェクト型は
vb.netなら dbnull.value 入ってると convert.tostringで空文字列になりますよ

text1.text= convert.tostring( datareader("得意先") )
text1.text= datatable.tables(0).rows(0).item("得意先") )

DBに書き込む時は
パラメータクエリーにして
if text1.text="" then
  param.add("@01",dbnull.value)
else
  param.add("@01",text1.text)
endif

SQL分 update table1 set 得意先 = @01


ちる  2005-09-16 02:40:03  No: 125340

我龍院忠太さん、ご指摘有難うございます。

了解しました。別スレッドを立てさせていただきます。


s  2005-09-17 00:39:31  No: 125341

>葉月α
お前ひとりでなにいってんの?意味和漢ねーんだけど。
変な奴


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加