【发布时间】:2019-09-06 11:57:11
【问题描述】:
我有一个 SQL Server 数据库,我的一个表LatestData 有一个不可为空的列DATETIME,默认值为01/01/1970。请参阅此列的确切 T-SQL 代码下方的代码。
[MyDateTime] DATETIME DEFAULT (CONVERT([DATETIME], CONVERT([DATE], '1970/01/01 00:00AM', (0)), (0))) NOT NULL
当通过.EDMX 数据模型将此表添加到我们的服务器代码(C#)中时,该字段如下所示:
public System.DateTime MyDateTime { get; set; }
我通过C#向这个表添加了新数据,但是在添加行的时候,我的MyDateTime列没有任何数据。
由于列为Not Null,我的MyDateTime 字段自动设置为01/01/0001。
尝试将此日期添加到我的 DateTime 列会引发以下错误:
System.Data.SqlClient.SqlException:将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。
在做了一些研究后,我发现 C# Datetime MinDate 是 01/01/0001,而 SQL Server DATETIME 的 minDate 是 01/01/1753,这是导致错误的原因。
C# 代码将“空”字段作为01/01/0001 传递给数据库,然后尝试对其进行转换。这显然是不成功的。
数据库有没有办法知道恢复到默认值,而不是先尝试转换DATETIME,或者在转换失败时这样做?
我知道我可以将 Datatable 中的列设置为 DateTime2 或在通过 C# 添加之前为该列指定一个日期,但这似乎不是最好的方法?
提前感谢您的帮助。
【问题讨论】:
-
使用
datetime2代替日期时间。 C# 中也没有empty日期。 DateTime 是一个结构,因此它总是 有一个值。 “零”值为 1/1/001。这不是空的,这是默认的日期值。如果缺少日期,实体属性和数据库列应该可以为空,即DateTime?和datetime2(0) NULL。如果不想存储时间,请在数据库中使用date -
要么使该字段为空,要么使用docs.microsoft.com/en-us/dotnet/api/…
标签: c# sql-server tsql datetime