今天發生的問題。
問題
我的網頁,在 IE11 下執行會發生錯誤,但 Chrome 卻是正常。所以 IE 好…
錯訊訊息
幸好,我們有留 exception log,並且當錯誤時直接會寄信到我們的信箱。
System.Data.SqlClient.SqlException: The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.
怎麼會和 SQL 有關係呢?
再看程式碼
public Order GetFeedbackData(string taxNo, DateTime today) { const string sql = @"Select * from Orders where orderDate = {0}"; var query = _db.Database.SqlQuery<Order>( sql, today.ToShortDateString()).FirstOrDefault(); return query; }
原來,和 SQL 組字串有關。再看 ToShortDateString 的 msdn 說明,這個方法與Thread.CurrentCulture 有關。
答案呼之欲出了。
Web.Config
再看 Web.config, 有一段設定如下
<globalization culture="auto" uiCulture="auto"/>
查一下 http://msdn.microsoft.com/zh-tw/library/hy4kkhe0(v=vs.85).aspx,發現這個就是用來取得 Rquest 的 Thread.CurrentCulture 的根據。
使用 Fiddler 錄一下 Request, 發現 IE 11 的 Header Accept-Language: zh-Hant-TW,而 Chrome 的則為 zh-TW
答案揭曉。是 IE 10 之後,預設的 Accept-Language 改為 zh-Hant-TW
解決
解決方法很簡單,就是
- 不要組SQL 字串啦!
public Order GetFeedbackData(string taxNo, DateTime today) { const string sql = @"Select * from Orders where orderDate = {0}"; var query = _db.Database.SqlQuery<Order>( sql, today.ToShortDateString()).FirstOrDefault(); return query; }
直接使用 today 的 DateTime 型別傳入 Entity Framework 讓它為我們查詢即可。