2014年6月25日 星期三

我的網頁在 IE 11 下不能執行!?

今天發生的問題。

問題

我的網頁,在 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

解決

解決方法很簡單,就是

  1. 不要組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 讓它為我們查詢即可。

參考

ASP.NET 2.0 多國語系網站與 Windows 8 的 IE10 語系設定

沒有留言:

Share with Facebook