我在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进行数据库目的。
答案 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
作为日期,并且完全抛出你看到的错误。
因此,为了解决这个问题,您需要:
DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss")
或类似方式)将日期输出为字符串DateTime
变量和不是字符串,从而允许SqlCommand
确保格式正确答案 2 :(得分:0)
将DateTime.Now
更改为DateTime.Now.ToString("yyyy/MM/dd HH:mm")
或将其作为参数传递,与您的其他值类似。