web-dev-qa-db-ja.com

ADO.NETでDBNULLとして使用されるDateTimeのnullオブジェクトの解析を管理する方法

2つのDateTimeオブジェクト、BirthDateとHireDateがあります。これらは文字列として正しくフォーマットされており、データアクセス層に渡すときに、DateTimeオブジェクトに解析する必要があります。

DateTime hD = DateTime.Parse(hire);            
DateTime bD = DateTime.Parse(birth);

//incase of a datestring being passed through
dateStringPassed = "7/2/1969";

ただし、文字列hireおよびbirthがnullまたは空の""である場合があります。このようにコードを実行すると、空の文字列の解析でFormatExceptionエラーが発生します。空の解析を管理し、DateTimeが空またはnullの場合、DBNull.Valueとして受け入れられるようにするにはどうすればよいですか?

ユーザーがDateTime文字列を渡さない場合でも管理できず、解析によってコードがクラッシュします。

生年月日のパラメータは次のとおりで、変数がnullかどうかを確認してから、DBNull.Valueを使用します。

10
GivenPie

nullable 日時を使用する必要があります-ショートカット構文はDateTime?になります(最後の?に注意してください)。

DateTime? hD = null;
if(!string.IsNullOrWhitespace(hire )) // string.IsNullOrEmpty if on .NET pre 4.0
{
   hD = DateTime.Parse(hire);            
}

hD.HasValueをテストし、代わりにDbNull.Valueを使用しないかどうかをテストできます。

3
Oded

Parseメソッドは空の文字列を処理できませんが、null許容のDateTimeを使用して、次のようにすることができます。

DateTime? hD = String.IsNullOrEmpty(hire) ? (DateTime?)null : DateTime.Parse(hire)

しかし、さらに安全なのは、代わりにTryParseを使用することです。

DateTime? hD = null;
DateTime.TryParse(hire, out hD);

次に、この値を格納するために、hD.HasValueをテストできます。

if(hD.HasValue) { /* use hD */ }
else { /* else use DBNull.Value */ }

C#7以降、インライン出力パラメーターに短い構文を使用でき、null許容型を完全に回避できます。

if (DateTime.TryParse(hire, out var hD)) { /* use hD */ }
else { /* use DBNull.Value */ }
13
Honza Brestan

このメソッドを使用する場合、正しい日付でないものはDBNull.Valueを返します。

/// <summary>
/// Parses a date string and returns
/// a DateTime if it is a valid date,
/// if not returns DBNull.Value
/// </summary>
/// <param name="date">Date string</param>
/// <returns>DateTime or DBNull.Value</returns>
public static object CreateDBDateTime(string date)
{
    DateTime result;
    if (DateTime.TryParse(date, out result))
    {
        return result;
    }
    return DBNull.Value;
}
0
Jens Granlund