none
ADO.net DataSetでの値の取得時のDBNullエラーについて RRS feed

  • 質問

  • 毎度お世話になります。ジープです。

     

    前スレの「ADOを利用したSQLServer接続への例外処理」でADO.netへの移行を薦められたため、現在移行作業を行っています。

    現在DataAdapterとDataSetを使用し、データベース上からデータを取得するところまではこぎつけたのですが…

    DataSetでDBNullを取得すると、デザイナコードで止まってしまいます。

    以前のプログラムでは、データベース側ではDBNullを許容しているので、プログラム側でDBNullの場合は無視する、という形をとっていたので、今回も同じようにしたかったのですが…

     

    気持ちデザイナコードでのCatch部分を削除したいけど…やっぱデザイナコードいじるのはよくないですよね…

    正攻法としては値の取得側でTry~Catchで例外を取得して、無視させるしかないんでしょうか…

    この場合はどのような処理がもっとも正しいのでしょうか?

    ご教授願います。

     

    ~~~~~~コード~~~~~~

    sub SetListViewData()

            Dim l_strName as String

       if  Me.DataSet1.個人テーブル.Item(0).氏名 Is System.DBNull.Value Then

                     l_strName = Me.DataSet1.個人テーブル.Item(0).氏名

                     l_strName = l_strName.Trim(" ")

                     ListView1.Items.Add( l_strName)

            End if

    End sub

     

    2007年1月30日 2:52

回答

  • 手っ取り早くは、SQL文でISNULL関数を使って、nullを空白文字に変えてしまうという方法があります。
    2007年1月30日 7:49
    モデレータ
  •  ジープ さんからの引用
    sub SetListViewData()

            Dim l_strName as String

       if  Me.DataSet1.個人テーブル.Item(0).氏名 Is System.DBNull.Value Then

                     l_strName = Me.DataSet1.個人テーブル.Item(0).氏名

                     l_strName = l_strName.Trim(" ")

                     ListView1.Items.Add( l_strName)

            End if

    End sub


    Me.DataSet1.個人テーブル.Item(0).Is氏名Null() というメソッドがあるはずです。
    提示されたプログラムの if 条件も逆になっている気がします。

    2007年1月30日 8:50

すべての返信

  • 手っ取り早くは、SQL文でISNULL関数を使って、nullを空白文字に変えてしまうという方法があります。
    2007年1月30日 7:49
    モデレータ
  •  ジープ さんからの引用
    sub SetListViewData()

            Dim l_strName as String

       if  Me.DataSet1.個人テーブル.Item(0).氏名 Is System.DBNull.Value Then

                     l_strName = Me.DataSet1.個人テーブル.Item(0).氏名

                     l_strName = l_strName.Trim(" ")

                     ListView1.Items.Add( l_strName)

            End if

    End sub


    Me.DataSet1.個人テーブル.Item(0).Is氏名Null() というメソッドがあるはずです。
    提示されたプログラムの if 条件も逆になっている気がします。

    2007年1月30日 8:50
  • trapemiyaさん、えムナウさん返信ありがとうございます。

     

     trapemiya さんからの引用
    手っ取り早くは、SQL文でISNULL関数を使って、nullを空白文字に変えてしまうという方法があります。

    データベース自体に空白文字ですか…

    その場合、直にデータベースにレコード追加しちゃった場合はDBNULL入っちゃうんですよね…(自分以外の人もそのツール、データベースに触ることがあると思われる)

    #空白といえば、今adpファイル使ってるんですが、データベースのchar30のレコードに”aaa”と入れた場合は、aaaのあとに27文字文空白文字が入っており、値の取得ごとにTrimしなければならず異様にムカついた記憶が…w

     

     えムナウ さんからの引用
    Me.DataSet1.個人テーブル.Item(0).Is氏名Null() というメソッドがあるはずです。

    探してみたらありました!

    こんなメソッドあったとは…初めて知りました…

    便利なので使わせていただきます(ノ・ω・)ノ

    #Is**Nullって関数名、わかりやすいのはいいと思うのですが、ヘルプなどで情報検索する場合って絶対ヒットしないですよね…自分的にはあんましよくないと思うのですがね…

     


     えムナウ さんからの引用
    提示されたプログラムの if 条件も逆になっている気がします。

    ぉl

    ごめんなさいNotぬけてました…

    ソース貼り付けではなくて、目コピーでやったので…

    申し訳ないですorz

     


    お二人の助言により、無事解決できました。

    ありがとうございました。またよろしくお願いします^^

     

    2007年1月31日 1:05
  •  ジープ さんからの引用

    データベース自体に空白文字ですか…

    勘違いされているかもしれないので、念のために書いておきます。ISNULL関数は例えば、

    select ISNULL(hoge, '') from HogeTable

    のように使います。hogeがnullの場合は、空白文字を返します。

     ジープ さんからの引用

     えムナウ さんからの引用
    Me.DataSet1.個人テーブル.Item(0).Is氏名Null() というメソッドがあるはずです。

    探してみたらありました!


    よく見たら型付データセットなんですね。Orz

    2007年1月31日 1:18
    モデレータ
  •  trapemiya さんからの引用

    勘違いされているかもしれないので、念のために書いておきます。ISNULL関数は例えば、

    select ISNULL(hoge, '') from HogeTable

    のように使います。hogeがnullの場合は、空白文字を返します。

    あ、SQL分の値の取得時に使うのですか(・∀・ )

    データベース書き込み時にやるのかとてっきり…(ノ∀`)

     

     trapemiya さんからの引用

    よく見たら型付データセットなんですね。Orz

    ですです(・ω・`)

    んでもTabelAdaptarへ記入するSelect文につかえそうですね。

    ありがとうございます(・∀・)

    2007年1月31日 7:27