10

我尝试在我的数据库中为键入 'date' 的字段插入值 null (DateTime) 但我总是得到一个'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-01SSMS

有人可以解释一下为什么我不能得到一个真正的 'NULL' 吗?

此致

4

5 回答 5

10

我认为这是对应于null的值

于 2013-05-22T13:10:51.393 回答
5

如果Last_Modified_Date是 type DateTime,则不能有“真正的 null”,因为DateTime 结构- 正如其他人已经说过的那样 - 不可为空。所以你的示例代码甚至不会编译。

如果Last_Modified_DateDateTime?( Nullable<DateTime>) 类型,则您的代码是正确的,但是-正如@Nikola Dimitroff 在他的回答中所说-您的数据库中不能有“真正的空值”,因为默认值为DateTime?01/01/0001 00:00:00 .

您正在寻找的“真正的空”是DBNull.Value,但您只能将其用于System.DBNull类型;如果你分配Last_Modified_Date = DBNull.Value,无论是什么类型Last_Modified_Date,你的代码都不会编译。

于 2013-05-22T14:04:33.367 回答
2

当你说你试图放一个 nullDateTime时,你是在使用Nullable<DateTime>(aka DateTime?) 还是简单地DateTime?后者是一个值类型,它的默认值正好是01/01/0001 00:00:00

于 2013-05-22T13:15:33.957 回答
0

至于 ADO.NET(至少从 .NET 4.7 开始),传递null(例如 using ExecuteNonQuery)被转换为 SQLDEFAULT关键字。

这可以使用 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”。

更多细节可以在这个答案中找到。

于 2021-08-09T13:01:41.010 回答
-2

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

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

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

于 2021-03-19T02:12:43.903 回答