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を使用します。
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
を使用しないかどうかをテストできます。
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 */ }
このメソッドを使用する場合、正しい日付でないものは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;
}