2012-04-19 16 views
8

私は自分のデータベースをDataReaderで読み取っています。C#オブジェクトnullチェック

と一部の行には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オブジェクトをチェックする方法を知っていますか?

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

+0

'=='または '!='ではなく '.Equals'を使用します。また、 'null'だけでなく、' DBNull'をチェックする必要があるかもしれません。 (はい、違います)。 – Servy

+0

重複の可能性はありますか? http://stackoverflow.com/questions/3432974/datareader-is-null-or-empty –

答えて

11

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

  • nullとDBNullが異なります。

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

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

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

この背景では、(reader["fdate"].Equals(null))はここでは使用できません。あなたはDBNull.Valueでそれをチェックする必要があります。タイプがDBNullの場合、またはそれがDBNull.Valueに等しい場合は、あなたが好きな値を割り当てます。 Iが参照型(VARCHARの文字列)またはNULL可能包ま値型(日時?)のいずれかでNULL可能データベース列を表現したいこのような状況では

+3

+1実際に何かを説明するために+1。私は少し編集の自由を取った;あなたが同意しない変更を取り消してください。 – phoog

+0

@phoogそれをより良くしてくれてありがとう。 – Sandeep

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; 
1

は、以下のことを試してみてください。

DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value 
    ? DateTime.ParseExact(reader["fdate"]) 
    : DateTime.Today; 
1
DateTime flsdate = DateTime.Today; 
if(reader["fdate"] != null) 
    flsdate = Convert.ToDateTime(reader["fdate"]) 
4

。これにより、プログラム内のデータベーススキーマをより正確に表現できます。

これも、あなたはもっときれいにフォーマットを使用して変換ロジックを記述することができます:

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

このキャストは、DataReaderの結果はDbNullにあるとFDATEがデフォルトに設定された場合に失敗します(日時を?)これはnullです。その時点で、null可能な型が値を持つかどうか(fdate.HasValue)、そうでない場合はdefault - DateTime.Todayを使用して、実際の望ましい値を取得できます。

関連する問題