我尝试在数据库中插入值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
有人可以解释为什么我无法获得真正的“空”' ?
祝你好运
答案 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)
print(type(df['col_name'].get(key='0001-01-01 BC')))
<class 'NoneType'>
它不是空的,更具体地说,它是 NoneType。