存储在数据库中的日期为null返回为01/01/1900,而不是DateTime.minvalue



我有一个逻辑,可以执行以下操作:

string myData =  Convert.ToDateTime(Info.ClosedDate) == DateTime.MinValue ? String.Empty : "(" + Info.ClosedDate + ")";

,如果未作为数据库中的null存储,则应在括号中返回封闭状态。否则,它应该返回一个空字符串。

Convert.ToDateTime(Info.ClosedDate)的值是01/01/1900DateTime.MinValue的值是1/1/0001 12:00:00 AM

因此,条件永远不会返回String.Empty

当前对象中的字段表示为:

public string ClosedDate
{
    get { return _ClosedDate; }
    set { _ClosedDate = value; }
}

最好的解决方案是什么?

不存储或模型DateTime类型为string

这适用于数据存储,也适用于代码中的模型。如果在数据库中可以将其无效,而不是模型为Nullable<DateTime>(替代符号DateTime?)。通常在最后一刻,通常在演示层中将其转换为string。如果您这样做,则在阅读/写入数据存储时无需进行任何类型的转换。您还避免了对价值解释的歧义(就像什么值是null的,或者它本地化为" dd/mm/yyyy"或" mm/dd/yyyy" )。

private DateTime? _ClosedDate;
public DateTime? ClosedDate
{
    get { return _ClosedDate; }
    set { _ClosedDate = value; }
}

侧面注意:以上也可以建模为自动属性,但我没有这样做,因为尚不清楚模型中如何使用该字段

如果您不确定如何将DateTime实例传递到ADO.NET查询作为本机格式中的参数,请查看以前的问题/答案:如何将用户供应的输入添加到SQL语句?

您可以与SqlDateTime.MinValue

进行比较
Convert.ToDateTime(Info.ClosedDate) == SqlDateTime.MinValue? String.Empty : "(" + Info.ClosedDate + ")";

https://learn.microsoft.com/en-us/dotnet/api/system.data.sqltypes.sqldatetime.minvalue?

尽管最好将DateTime用作日期类型,但您的代码应该喜欢:

public DateTime ClosedDate
{
    get; set;
}

您也可以使用此类自动属性或将其设置为要求的自动属性。

public DateTime ClosedDate 
{
   get;
   set
   {
     Date = DateTime.Now;
   }
}

对于字符串,您可以使用DateTime.ParseDateTime.ParseExact而不是Convert.ToDateTime

如果值为null,则ParseParseExact返回ArgumentNullException,并且如果值包含某种无效的日期格式,则返回FormatException

var convertedDate = DateTime.ParseExact(dateTime, "yyyyMMdd", CultureInfo.InvariantCulture);

最新更新