【问题标题】:cannot insert null for date using dictionary无法使用字典为日期插入 null
【发布时间】:2018-09-26 22:24:49
【问题描述】:

我正在尝试使用 C# 和 SQL 插入记录,但是当日期列为空时出现此错误,我搜索了类似的案例但尚未解决。它插入 01/01/1900,表中的列是 Datetime 任何想法或类似案例链接。

[HttpPost]
public HttpResponseMessage save (Education edu)
{
    Dictionary<string, object> xmt = new Dictionary<string, object>();

    xmt.Add("@Staff_Key", edu.Staff_Key);
    xmt.Add("@Type_Education", edu.Type_Education);
    xmt.Add("@Qual", edu.Qual);
    xmt.Add("@Uni", edu.Uni);
    xmt.Add("@Date_Issue", edu.Date_Issue.ToString() == null ? "Null" : edu.Date_Issue.ToString());
    xmt.Add("@Notes", edu.Notes);

    obj.ExecNonQuery(
       @"insert into HR_DocEducation (Staff_Key,Type_Education,Qual,Uni,Date_Issue,Notes)
       values (@Staff_Key,@Type_Education,@Qual,@Uni,@Date_Issue,@Notes) ",xmt);

    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created);
    return response;

【问题讨论】:

  • 是的,它在类代码中可以为空
  • DateTime 不是可为空的类型。如果您不提供值,则它等于 DateTime.MinValue 这就是它采用 01/01/1900 并插入表中的原因。
  • DateTime "null" value的可能重复
  • 请注意,检查ToString() 调用的结果是否为null 几乎永远不会起作用。但是如果不了解更多细节就很难提供帮助 - edu.Date_Issue 的类型是什么?

标签: c#


【解决方案1】:

哈桑, 我遇到了同样的问题,除了使用可为空的 DateTime DateTime? 对象之外的技巧是更正三元运算符如下:

xmt.Add("@Date_Issue", edu.Date_Issue == null ? (object) DBNull.Value : (object)edu.Date_Issue);

而不是

xmt.Add("@Date_Issue", edu.Date_Issue.ToString() == null ? "Null" : edu.Date_Issue.ToString());

【讨论】:

  • 老实说,我认为转换为字符串可能不是一个好主意。 (我们甚至不知道Date_Issue 的类型也无济于事。)
  • 我知道Date_Issue 是问题中的字符串,基于他尝试用字符串值分配它的方式,xmt.Add("@Date_Issue", edu.Date_Issue.ToString() == null ? "Null" : edu.Date_Issue.ToString());
  • 永远不会将edu.Date_Issue 视为字符串。条件运算符的第二个和第三个操作数都是字符串,因为第三个操作数涉及另一个 ToString() 调用。如果您认为Date_Issue 的类型是string,为什么要包含ToString() 调用anywhere
  • 但是如果它是不同的类型,那么是的,你是对的,没有必要转换为字符串,我已经编辑了我的答案以使其更通用。
  • 正确,我以为您说的是字典成员 Date_Issue 而不是 edu.Date_Issue。我已经相应地编辑了我的答案。谢谢。
【解决方案2】:

正如 Astha Srivastava 所说,您可以找到关于 DateTime 对 null 值的行为的简短描述。

Question: DateTime “null” value

一种可能的方法是使用属性DBNull.Value,它引用数据库上使用的值。我可以推荐在使用 SQL 命令时使用它。

经过简短的查找,我发现了您的类似问题,以DBNull.Value 为例。查找它,如果它可以帮助您为答案投票。

Question: Nullable DateTime and the Database

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多