none
ACESS からデータを取り出す際の問題について RRS feed

  • 質問

  • にゃごにゃごです。いつもお世話になっております。

    さて、ACCESS の複数のテーブルを内部結合し、データを読み出したとき、その列が空であると、System.DBNull が戻されます。この列の定義は、

    テキスト形

    フィールドサイズ: 255

    値要求: いいえ

    空文字列の許可: はい

    インデックス: いいえ

    としています。

    このテーブルを単独で読み出すとこのような現象は起こりません。

    プログラムの概要は次の通りです。

          dim da1 as New DataTable

          cn.ConnectionString = "Provider = Microsoft.Ace.OLEDB.12.0; Data Source = G:\Periodical_Literature.accdb"
          da = New OleDbDataAdapter("SELECT sel.*, ba.*, detail.* FROM Selected_Data sel, Base_Data ba, Detail_Data detail WHERE " & _
                                 "((sel.Book_Name = ba.Book_Name) AND " & _
                                  "(sel.Book_Name = detail.Book_Name) AND " & _
                                  "(sel.Volumes = detail.Volumes)) ORDER BY sel.Book_Name, sel.Volumes", cn)
          da.Fill(dt1)

    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

    TxtBox14.Text = dt1(Disp_Data_Count)(22)

    ここで、 Disp_Data_Count は、表示データ件数のカウンタです。(1 画面に 1 件のデータを表示)

    dt1(Disp_Data_Count)(22) に文字列が或場合は、エラーとならず正常に表示されますが、データが空の場合は

    "型 'DBNull' から型 'String' への変換は無効です。” というエラーメッセージが表示されます。なお、ほかの列にも空のデータが有りますが、そこではエラーとなりません。

    なお、dt1(n)(22) は、1 行の最後の列です。

    初歩的な質問で恐縮ですが宜しくお願いいたします。

     

    2011年9月22日 9:25

回答

  • 状況をはっきり把握しているわけではないのですが、dt1にnull値があるのであれば、nullでない値、例えば空文字にしてしまえばいいのではないでしょうか?
    SQLでnull値を空文字に変換するには、iifとisnullを使用して、例えば以下のようにします。

    select iif(isnull(MyCol), '', MyCol) as MyCol from Table1

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年9月23日 2:06
    モデレータ

すべての返信

  • 状況をはっきり把握しているわけではないのですが、dt1にnull値があるのであれば、nullでない値、例えば空文字にしてしまえばいいのではないでしょうか?
    SQLでnull値を空文字に変換するには、iifとisnullを使用して、例えば以下のようにします。

    select iif(isnull(MyCol), '', MyCol) as MyCol from Table1

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年9月23日 2:06
    モデレータ
  • trapemiya さま、にゃごにゃごで御座います。

    この度は、初歩的な質問にも関わらずご回答を頂き、まことに有り難うございました。お陰様で無事プログラムの作成を終えることが出来ました。

    それにしても不思議なのは、テキスト形と定義したカラムにデータが無い場合、NULL 値が戻ってくることです。同じテーブルでも、テキスト形のカラムがありますが、データが無い場合、'' が戻ってきます。問題のカラムは、途中で追加した経緯があるのでそのためかも知れないと、と思ってみたりするのですが。

    今回は、本当に有り難う御座いました。

     

    2011年9月26日 23:55
  • データが無いのと、空文字は基本的に違いますよ。※DBMSによってですが・・・

     

    NULL の認識はデータが無いとの認識で構わないと思いますが、

    空文字は長さ0の文字列データが設定されている状態です。

     

    注:Oracleでは NULL と '' は同様に動いたりするので、”基本的に”と書かせて頂きました。

    2011年9月27日 0:58
  • それにしても不思議なのは、テキスト形と定義したカラムにデータが無い場合、NULL 値が戻ってくることです。同じテーブルでも、テキスト形のカラムがありますが、データが無い場合、'' が戻ってきます。問題のカラムは、途中で追加した経緯があるのでそのためかも知れないと、と思ってみたりするのですが。

    aaviator__さんが書かれていることに従って、そのテーブルのそれぞれの列に、空文字(長さ0の文字列)が入っているのかNULLが入っているのかをまず確かめられてみてはいかがでしょうか? クエリを作成し、フィールドとして以下の式を追加すると簡単に見分けることができます。

    IIf(IsNull([空文字が戻って来ているフィールド名]),"(null)",Format([空文字が戻って来ているフィールド名], "@;(空文字)"))

    と、

    IIf(IsNull([nullが戻って来ているフィールド名]),"(null)",Format([nullが戻って来ているフィールド名], "@;(空文字)"))

    #Accessってデータシートビューでnullと空文字の区別をして表示してくれないみたいですね。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年9月27日 1:21
    モデレータ