插入显示异常的DB

时间:2013-12-13 13:55:23

标签: c# .net sql-server

我在db中插入一些值。在DB字段中,received_date是datetime数据类型的类型我使用以下代码进行插入但它显示了一些异常,我无法弄明白。

例外:

  

将varchar数据类型转换为日期时间数据类型   导致超出范围的价值。

SqlConnection con = new SqlConnection("data source=ATLBLRDP-19\\PRIME;database=arp;uid=sa;pwd=****;");
            con.Open();

            SqlCommand cmd_r = new SqlCommand();
            cmd_r.Connection = con;
            cmd_r.CommandType = CommandType.Text;
            cmd_r.CommandText = "insert into raw_mails(received_date,sender,receiver,subject,body,has_parsed,has_attachments,created_by,created_on,mail_type) Values(@received_date,@sender,@receiver,@subject,@body,@has_parsed,@has_attachments,'" + DateTime.Now + "','" + DateTime.Now + "',@mail_type)";
          cmd_r.Parameters.Add("@received_date", em.DateTimeReceived);
            cmd_r.Parameters.Add("@sender", em.From);
            cmd_r.Parameters.Add("@receiver",  em.Receiver);
            cmd_r.Parameters.Add("@subject", em.Subject);
            cmd_r.Parameters.Add("@body", em.Body);
            cmd_r.Parameters.Add("@has_parsed", 1);
            cmd_r.Parameters.Add("@has_attachments", em.HasAttachments);
            cmd_r.Parameters.Add("@mail_type", 4);
            cmd_r.ExecuteNonQuery();
            con.Close();

我检查了每个查询(parameters.add())都工作但是如果我尝试插入received_date然后只显示异常。 此处em是EmailMessage的类型。

我正在使用sql server 2012进行数据库目的。

3 个答案:

答案 0 :(得分:1)

日期时间数据类型的有效范围是1753-01-01到9999-12-31(Date and Time Data Types and Functions (technet)

如果em.DateTimeReceived属性小于1753-01-01,则会出现此错误。根据从.NET到SQL的数据转换,当DateTimeReceived null 时也可能出现这种情况。

确保您的属性值始终大于1753-01-01,或使用范围从0001-01-01开始的datetime2数据类型。

旁注:您是否还有使用旧版日期时间数据类型的具体原因? Microsoft建议“使用time,date,datetime和datetimeoffset数据类型进行新工作。这些类型与SQL Standard一致。它们更具可移植性.time,datetime2和datetimeoffset提供更多秒精度.datetimeoffset为时区提供时区支持全球部署的应用程序。“msdn

答案 1 :(得分:1)

您没有给予太多帮助,但很明显您使用字符串在Sql服务器上设置日期值。

根据em.DateTimeReceived的类型,肯定有两个,可能有三个地方。构建CommandText时,您还会插入DateTime.Now两次,隐式调用.ToString()进行转换。

但是,调用.ToString()将使用您系统的区域设置。例如,我在英国,所以今天的日期(12月13日)写成"13/12/2013 14:02:08"。如果我将此字符串分配给sql datetime,它将失败,因为我的Sql服务器正在使用它的默认美国语言环境 - 因此它将13显示为月份,12作为日期,并且完全抛出你看到的错误。

因此,为了解决这个问题,您需要:

  • 使用与您的Sql server的排序规则匹配的显式格式(使用DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss")或类似方式)将日期输出为字符串
  • 确保传入的所有日期都是实际的DateTime变量和不是字符串,从而允许SqlCommand确保格式正确

答案 2 :(得分:0)

DateTime.Now更改为DateTime.Now.ToString("yyyy/MM/dd HH:mm")或将其作为参数传递,与您的其他值类似。