8

null 値を含むテーブルがあり、SqlDataReader を使用してテーブルからデータを取得する必要があります。DBNull を安全に int にキャストする方法がわかりません。

私は現時点でこの方法でそれをやっています:

...
reader = command.ExecuteReader();
while (reader.Read()) {
     int y = (reader["PublicationYear"] != null) ? Convert.ToInt32(reader["PublicationYear"]) : 0;
     ...
}
...

Object cannot be cast from DBNull to other types.しかし、PublicationYear が nullの場合に取得します。

どうすれば安全に値を取得できますか?

ありがとう。

4

9 に答える 9

13

ではなくと比較する必要がreader["PublicationYear"]あります。DBNull.Valuenull

于 2012-02-21T12:37:21.683 に答える
4

DBNullと同じではありませんnull。代わりに、次のようなことを試してください。

int y = (reader["PublicationYear"] != DBNull.Value) ? ...
于 2012-02-21T12:37:40.167 に答える
3
int ord = reader.GetOrdinal("PublicationYear");
int y = reader.IsDBNull(ord) ? 0 : reader.GetInt32(ord);

または、代わりに:

object obj = reader["PublicationYear"];
int y = Convert.IsDBNull(obj) ? 0 : (int)obj;
于 2012-02-21T12:37:56.547 に答える
2

代わりに、次のことができます。DBNull を 0 に変換しているので、選択を行う手順を変更してください。選択自体が null 値に対してゼロを返すようにします。

アイデアを示すためのスニペット

    SELECT ...
           ,ISNULL (PublicationYear, 0) as PublicationYear
           ...
    FROM sometable

これの利点は、コードで追加のチェックが必要ないことです。

于 2012-02-21T12:48:41.453 に答える
2

変化する

reader["PublicationYear"] != null

reader["PublicationYear"] != DBNull.Value

于 2012-02-21T12:38:22.710 に答える
2

返された値が型であるかどうかを明示的に確認する必要がありますDBNull

while (reader.Read()) {
     int y = (!reader["PublicationYear"] is DBNull) ? Convert.ToInt32(reader["PublicationYear"]) : 0;
     ...
}

実際、この比較は値だけでなく、次のように行うこともできます。

reader["PublicationYear"] != DBNull.Value

DBNullつまり、null 自体ではなく、データベースから null が返されることを期待できます。

于 2012-02-21T12:38:24.657 に答える
1

データベースの null 値は、次のものと比較する必要がありますDBNull.Value

reader = command.ExecuteReader();

while (reader.Read()) 
{
     int y = (reader["PublicationYear"] != DBNull.Value) ? Convert.ToInt32(reader["PublicationYear"]) : 0;
     ...
}
于 2012-02-21T12:48:12.227 に答える
1

それはエラーです: (reader["PublicationYear"] != null) DBNull.Valueをテストする必要があります....

于 2012-02-21T12:37:54.723 に答える
1

テストを から(reader["PublicationYear"] != null)に変更します(reader["PublicationYear"] != DBNull.Value)

于 2012-02-21T12:37:58.763 に答える