2016-10-13 10 views
0

IDataReaderインターフェイスを使用して、nullable datetimeを読み返しています。これまでの私の以前の列の読み込みは、期待どおりに動作しています。nullable datetime値をデータ・リーダーを使用してstringに変換する方法はありますか?

この列を除いて、ヌル可能な日付時刻を読み取ろうとする["Implementation End Timestamp"]を文字列に変換し、Implementation_End_Stringという文字列プロパティに割り当てます。

これは私が試みたものです。最初にDateTime?の値を読み取ってnullをチェックし、nullでない場合はtoString()を変換しようとします。

しかし、この割り当ては、それらがされていないに許可されていません「の文字列とDateTimeの間には明示的な変換?」:

Implementation_End_String = dataReader["Implementation End Timestamp"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(dataReader["Implementation End Timestamp"]).ToString("d-MMMM-yyyy"), //show full month name 

は私が)(私はのtoStringを呼び出すためのDateTimeのvalueを取得する必要があると思いますその上に。

質問:

私は、文字列型にリードバックDateTime?値を変換できますか?

+0

フィールドにDateTimeが含まれていると想定される場合、なぜそれを文字列に変換してからDateTimeに戻したいのですか? – Steve

+0

'Implementation_End_String'は文字列プロパティではありません。読み込み後の '[" Implementation End Timestamp "]'日付を短い月形式の文字列表現に変換したいと思います。その後、それを文字列変数に代入します。 –

答えて

3

すべてNullable<T>タイプはGetValueOrDefaultメソッドを持っています。値がない場合は、このメソッドを使用して値またはデフォルト値のT(場合によってはDateTime.MinValue)を取得できます。このメソッドは、平文DateTimeオブジェクトを返します。したがって、ToString()メソッドを呼び出すことができます。

+2

ああ、私は当時の文書を読んでいたはずですね! ;) –

+0

いつもドキュメントを読むのは良いです;-) –

+1

私が言ったように - ドキュメントを読むのは良いことです! 'GetValueOrDefault'は' T'型のデフォルト値を返しますので、デフォルトの 'DateTime'値である01/01/0001 00:00:00となります。したがって、nullではないが、 'DateTime.MinValue'でない場合はチェックしないでください。混乱させて申し訳ありません!誰かがGoogleにこの質問をする場合の回答を更新しました:-) –

3

IDataReaderはかなり古いインターフェイスなので、ネイティブにnull可能な型はサポートされません。コードの多くの場所でそれを使用する傾向がある場合、コードを大幅に削減するいくつかのヘルパーを作成する方がよいでしょう。例えば、ここにDateTime?のためのヘルパーメソッドがあり、簡単に他のタイプについても同様行うことができます:

public static class DataReaderExtensions 
{ 
    public static DateTime? GetNullableDateTime(this IDataReader source, string name) 
    { 
     return source.GetNullableDateTime(source.GetOrdinal(name)); 
    } 
    public static DateTime? GetNullableDateTime(this IDataReader source, int i) 
    { 
     return !source.IsDBNull(i) ? source.GetDateTime(i) : (DateTime?)null; 
    } 
} 

はこれ、C#6 null conditional operatorとの組み合わせでそのような単純な問題でタスクを行います:

Implementation_End_String = dataReader 
    .GetNullableDateTime("Implementation End Timestamp")?.ToString("d-MMMM-yyyy") ?? ""; 
+0

良いアイデアは、 '.Value.ToString(" d-MMMM-yyyy ")? ""、 '文字列にする? –

+0

toStringの前に.valueを使用すると、Nullableオブジェクトに値が必要です。 "また、私は '?.String(" d-MMMM-yyyy ")? ""、しかし、その割り当てに構文エラーがあります。 –

+0

いいえ、 '.Value'であってはいけません。構文エラーが発生している場合は、VS2015を使用していない可能性があります(C#6の回答に注意してください)。 –

関連する問題