为什么当我插入DateTime null时我在SQL Server中有“0001-01-01”?

时间:2013-05-22 13:08:26

标签: c# sql sql-server null default

我尝试在数据库中插入值null(DateTime),用于输入字段' date'但我总是得到' 0001-01-01' 。我不明白,这个领域"允许空值"而且我不知道为什么我有这个默认值。

我使用C#asp .net和MVC(实体框架),这是我的代码:

Budget_Synthesis newBS = new Budget_Synthesis
{
    Budget_Code = newBudgetCode,
    Last_Modified_Date = null
};
db.Budget_Synthesis.AddObject(newBS);

Last_Modified_Date是否输入System.DateTime?所以我不知道他们为什么要改变这个' null'。

如果我尝试在我的应用程序上显示该值,我会得到01/01/0001 00:00:00

0001-01-01与SSMS

有人可以解释为什么我无法获得真正的“空”' ?

祝你好运

5 个答案:

答案 0 :(得分:10)

我认为这是与null

对应的值

答案 1 :(得分:4)

如果Last_Modified_Date的类型为DateTime,则您无法使用"真正的空值"因为DateTime structure - 正如其他人已经说过的那样 - 不可为空。所以你的示例代码甚至都不会编译。

如果Last_Modified_Date的类型为DateTime?Nullable<DateTime>),那么您的代码是正确的,但是@Nikola Dimitroff在他的回答中说 - 你不能拥有&#34 ;真零&#34;在您的数据库中,因为DateTime?的默认值是01/01/0001 00:00:00。

&#34;真零&#34;您要查找的是DBNull.Value,但您只能将其用于System.DBNull类型;如果你指定Last_Modified_Date = DBNull.Value,无论Last_Modified_Date的类型是什么,你的代码都不会编译。

答案 2 :(得分:2)

当您说要设置空DateTime时,您使用的是Nullable<DateTime>(a.k.a DateTime?)还是DateTime?后者是值类型,其默认值精确为01/01/0001 00:00:00

答案 3 :(得分:0)

对于 ADO.NET(至少从 .NET 4.7 开始),传递 null(例如使用 ExecuteNonQuery)被转换为 SQL DEFAULT 关键字。

这可以使用 SQL Server Profiler 进行验证。

例如以下代码:

var sqlCommand = new SqlCommand();
sqlCommand.CommandText = "EXEC CreateLog @UserName, @CreatedOn";
sqlCommand.Parameters.AddWithValue("@UserName", "George");
sqlCommand.Parameters.AddWithValue("@CreatedOn", (DateTime?)null);
sqlCommand.ExecuteNonQuery();

被翻译成:

exec sp_executesql N'EXEC CreateLog @UserName, @CreatedOn',
    N'@UserName nvarchar(6), @CreatedOn nvarchar(4000)',
    @UserName=N'George',@CreatedOn=default

这通常只会导致以下错误:

<块引用>

参数化查询 [...] 需要参数“@CreatedOn”,但未提供。

可以在this answer中找到更多详细信息。

答案 4 :(得分:-2)

在python编程语言中。代码的返回类型:

print(type(df['col_name'].get(key='0001-01-01 BC')))
<class 'NoneType'>

它不是空的,更具体地说,它是 NoneType