2013-12-13 63 views
0

我插入一些值到數據庫。在數據庫字段received_date是datetime數據類型的類型我正在使用下面的代碼插入但它顯示一些例外,我無法弄清楚。插入到DB顯示異常

例外:

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用於數據庫目的。

+1

什麼是.NET類型'DateTimeRece的ived',當你跨過時(在調試模式下),這個值是多少? – codingbiz

+0

約會是什麼時間? SQL的數據範圍比.NET小。 – Paparazzi

+1

您對'created_by和created_on'使用'datetime.now' ..檢查它.. – Moumit

回答

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確保格式是正確的
1

的有效範圍爲datetime數據類型是1753年1月1日至9999-12-31(Date and Time Data Types and Functions (technet)

如果em.DateTimeReceived性能比1753年1月1日時,你會得到這個錯誤。根據從.NET到SQL的數據轉換,當DateTimeReceived爲null時,情況也可能如此。

確保您的屬性值始終大於1753-01-01或使用具有從0001-01-01開始的範圍的datetime2數據類型。

一邊注意:是否有一個特定的原因,你仍然使用遺留的日期時間數據類型? Microsoft推薦「爲新工作使用時間,日期,日期時間2和日期時間集數據類型,這些類型與SQL標準保持一致,它們更加便於攜帶,timetime,datetime2和datetimeoffset提供了更高的秒精度。應用「。msdn

0

DateTime.Now更改爲DateTime.Now.ToString("yyyy/MM/dd HH:mm")或將它們作爲參數傳遞,與其他值類似。