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

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

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

Re[1]: DBNuulについて


(過去ログ 135 を表示中)

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

■79623 / inTopicNo.1)  DBNuulについて
  
□投稿者/ ED (1回)-(2016/04/22(Fri) 07:44:13)

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

「テーブル'テーブル名'にある列'列名'はDBNuulです。」
というメッセージがでます。

対処方法として
If (Not DBNull.Value.Equals(列名)) Then
処理
End If

を追加しましたが、まだ「テーブル'テーブル名'にある列'列名'はDBNuulです。」と出ます。

何が原因なのか解りません

開発環境は、VB.Net2010
DB postgres


大雑把で申し訳ございませんがよろしくお願いします

引用返信 編集キー/
■79624 / inTopicNo.2)  Re[1]: DBNuulについて
□投稿者/ 魔界の仮面弁士 (699回)-(2016/04/22(Fri) 08:41:26)
2016/04/22(Fri) 08:41:50 編集(投稿者)
2016/04/22(Fri) 08:41:49 編集(投稿者)

No79623 (ED さん) に返信
> If (Not DBNull.Value.Equals(列名)) Then

「列名」というからには、括弧の中身は String 値ですか?
String 型は DBNull インスタンスにはなりえませんよね。


DataRow に対して
 Dim o As Object = r("列名")
もしくは
 Dim o As Object = r!列名
のようにしたうえで、これが DBNull かどうかを確認するか、
 If r.IsDBNull("列名") Then
のように、IsDBNull メソッドで判定するようにします。


あるいは、
 Dim col1 As String = r.Field(Of String)("テキスト列")
 Dim col2 As Decimal? = r.Field(Of Decimal?)("数値列")
 Dim col3 As Integer? = r.Field(Of Decimal?)("整数列")
のように、Field 拡張メソッドで取得するようにすれば、
DBNull 値を Nothing として返すこともできます。

上記を If 二項演算子と組み合われば
 Dim cost As Decimal? = If(r.Field(Of Decimal?)("金額"), 0d)
のように、「NULL だった場合は 0 とみなす」ような取得方法にもできます。
引用返信 編集キー/
■79626 / inTopicNo.3)  Re[1]: DBNuulについて
□投稿者/ PANG2 (118回)-(2016/04/22(Fri) 10:01:36)
No79623 (ED さん) に返信
> 大雑把で申し訳ございませんがよろしくお願いします

型付DataSetの話?

エラーが出る行など書いて下さい。


引用返信 編集キー/
■79629 / inTopicNo.4)  Re[1]: DBNuulについて
□投稿者/ WebSurfer (895回)-(2016/04/22(Fri) 14:20:50)
No79623 (ED さん) に返信
> 「テーブル'テーブル名'にある列'列名'はDBNuulです。」
> というメッセージがでます。

Visual Studio のデータソース構成ウィザードでデータベースのテーブルから型付 
DataSet + TableAdapter を作って使ってますよね?

で、元になるデータベースのテーブル「テーブル名」のフィールド「列名」は NULL 
許可になってますよね?

そうすると型付 DataSet のコードに以下のようなクラス、プロパティが設定される
はずです。(以下は C# の場合ですが VB.NET も同様)

public partial class テーブル名Row : global::System.Data.DataRow {
            
    private テーブル名DataTable tableテーブル名;
            
    //・・・中略・・・
            
    public string 列名 {
        get {
            try {
                return ((string)(this[this.tableテーブル名.列名Column]));
            }
            catch (global::System.InvalidCastException e) {
                throw new global::System.Data.StrongTypingException("
                    テーブル \'テーブル名\' にある列 \'列名\' の値は DBNull です。", e);
            }
        }
        set {
            this[this.tableテーブル名.列名Column] = value;
        }
    }

    //・・・中略・・・
} 

「列名」プロパティの get アクセサを使って「テーブル名DataTable」からデータを取得
する際、そのデータが DBNull なのでキャストに失敗し、StrongTypingException がス
ローということだと思います。

質問者さんのコードではどのようにしている分かりませんが、自分ではそのようなコード
を書いてなくても、例えば、

テーブル名Row[] rows = (テーブル名Row[])dataTable.Select("ID='" + textBox1.Text + "'");
テーブル名BindingSource.DataSource = rows;

のようにすると、「列名」プロパティの get アクセサを使って「テーブル名DataTable」か
らデータを取得しようとします。

どこでそのようなことになっているのかデバッガを使って調べてください。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -