簡體   English   中英

插入顯示異常的DB

[英]Inserting into DB showing Exception

我在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進行數據庫目的。

日期時間數據類型的有效范圍是1753-01-01到9999-12-31( 日期和時間數據類型和函數(technet)

如果em.DateTimeReceived屬性小於1753-01-01,則會出現此錯誤。 根據從.NET到SQL的數據轉換,當DateTimeReceived為null時也可能出現這種情況。

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

旁注:您是否還有使用舊版日期時間數據類型的具體原因? Microsoft建議“將時間,日期,日期時間2和日期時間偏移數據類型用於新工作。這些類型與SQL標准一致。它們更具可移植性。時間,日期時間2和日期時間偏移提供更多的秒精度.datetimeoffset為全局部署的應用程序提供時區支持“。 msdn

您沒有給予太多幫助,但很明顯您使用字符串在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確保格式正確

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM