8

DataReader を使用してデータベースを読み取りました。

一部の行には fdate 値がありません。

したがって、null 日付を DateTime に変換すると、エラーが発生します。

フィールドが空かどうかを確認するにはどうすればよいですか?

AdsCommand cmd = conn.CreateCommand();
cmd.CommandText = "select name,fdate from abc";

AdsDataReader reader = cmd.ExecuteReader();

DateTime flsdate = (reader["fdate"].Equals(null))? Convert.ToDateTime(reader["fdate"]) : DateTime.Today;

Equals で試しましたが、うまくいきません。

null オブジェクトをチェックして変換エラーを回避する方法を知っている人はいますか?

ありがとうございました!

4

6 に答える 6

11

誰もが問題を解決する方法を指摘したので、NULL と DBNull の違いに関する情報を提供しようとしています。

  • nullと DBNull は異なります。

  • nullどのタイプのインスタンスでもありません。DBNull は、1 つのインスタンスを持つシングルトン クラスです: DBNull.Value.

  • nullは無効な参照をDBNull.Value表し、as は DB に存在しない値を表します。

  • DBNull.Valueテーブル内の存在しない値に対して db プロバイダーが提供するものです。

その背景(reader["fdate"].Equals(null))では、ここで使用するのは正しくありません。で確認する必要がありDBNull.Valueます。タイプが の場合DBNull、または と等しい場合はDBNull.Value、好きな値を割り当てます。

于 2012-04-19T19:45:35.750 に答える
5

DbNull を使用します。

http://forums.asp.net/t/1383849.aspx/1

于 2012-04-19T19:44:02.207 に答える
4

このような状況では、null 許容データベース列を参照型 (varchar の文字列) または Nullable ラップ値型 (DateTime?) で表すのが好きです。このようにして、プログラムでデータベース スキーマをより正確に表現できます。

これにより、次の形式を使用して変換ロジックをより明確に記述することもできます。

DateTime? fdate = datareader["fdate"] as DateTime?;

このキャストは、datareader の結果が DbNull であり、fdate が null である default(DateTime?) に設定される場合に失敗します。その時点で、null 許容型に値があるかどうか (fdate.HasValue) を確認し、ない場合はデフォルトの DateTime.Today を使用して、実際に必要な値を取得できます。

于 2012-04-19T19:54:32.183 に答える
2
DateTime flsdate = reader["fdate"].Equals(DBNull.Value)
    ? Convert.ToDateTime(reader["fdate"])
    : DateTime.Today;

しかし、日付を にデフォルト設定するのは危険なようですToday。代わりにこれを行います:

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value)
    ? Convert.ToDateTime(reader["fdate"])
    : (DateTime?)null;

さらに、fdate列の基になる tpe が既に DateTime である場合は、System.Convert を使用しないでください。

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value)
    ? (DateTime?)reader["fdate"])
    : null;
于 2012-04-19T19:43:27.403 に答える
1

次のことを試してください。

DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value
    ? DateTime.ParseExact(reader["fdate"]) 
    : DateTime.Today;
于 2012-04-19T19:43:31.523 に答える
1
DateTime flsdate = DateTime.Today;
if(reader["fdate"] != null)
    flsdate = Convert.ToDateTime(reader["fdate"])
于 2012-04-19T19:45:55.000 に答える