2015-12-18 54 views
1

我在多語言站點中使用EF將SP的結果映射到對象。使用其他文化時錯誤的DateTime解析

ctx.Database.SqlQuery<MyDTO>("MySP {0}", Id).SingleOrDefault() 

我發現在文化發生變化時映射日期存在問題。

更具體地說,根據用戶的文化,我得到的日期與16/12/2015 09:06:1512/16/2015 09:06:15相同。

我知道兩個解決辦法:

  • 獲取日期爲一個字符串,用CultureInfo.InvariantCulture解析它。
  • 在調用存儲庫方法之前將文化切換爲CultureInfo.CultureInvariant

也許還有另一種選擇:

  • 我看到我們同時改變:Thread.CurrentThread.CurrentUICultureThread.CurrentThread.CurrentCulture用戶的語言環境,但我認爲我們應該只切換UI之一。但我不知道如果我改變這個會破壞什麼...

有沒有其他的選擇,比如在EF上下文中設置文化?


更新: Chaning的Thread.CurrentThread.CurrentUICultureThread.CurrentThread.CurrentCulture只是在做查詢似乎並沒有幫助之前。這令人困惑......也許英孚在較早的時候緩存了這種文化?

+1

如果您將datetime數據*視爲* datetime數據,那麼應該沒有問題。只有在將數據轉換爲*字符串*時纔會出現格式問題。 *儘可能避免*轉換。那麼,你最後怎麼會像* 12/16/2015 09:06:15這樣的字符串? –

+0

@Damien_The_Unbeliever嗨。我最終想出了這一個。 :)我沒有使用字符串,我只是查看手錶中DateTime的值。這實際上是問題......看起來手錶使用當前線程的文化。原來日期是正確的(這個:'12/16/2015 09:06:15'無論如何不可能是有效的日期......永遠不會意識到......:D)太遲了。這個錯誤是後來在代碼中。我將在下面發佈答案。 – user2173353

回答

0

我已經想出了這一個最終。 :)

我正在查看手錶中的DateTime s的值。這實際上是個問題......看起來手錶使用當前線程的文化(從而改變從文化到文化的月份和日期順序)。原來日期是正確的(如果你認爲16是一個月,那麼:12/16/2015 09:06:15無論如何不可能是一個有效的日期......永遠不會意識到這一點......)。

所以,VS觀察家不知所措我......

很好的瞭解,當前線程的文化不會影響SQL數據的解析,正如我所期望的。 :)

實際的錯誤是後來在代碼中。

1

首先,你應該避免調用你的存儲過程 - 這是一個簡單的方法來獲得Sql注入安全問題的OWASP Top 10

string dateAsString = "12/16/2015 09:06:15"; 
string dateFormat = "MM/dd/yyyy HH:mm:ss"; 
DateTime theValue = DateTime.Parse(dateAsString, dateFormat, CultureInfo.InvariantCulture); 
SqlParameter myDate = new SqlParameter("@theDate", theValue); 
context.Database.ExecuteSqlCommand("MySP @theDate", theDate); 
+0

我的印象是'ctx.Database.SqlQuery'在設計上可以防止SQL注入,它與'String.Format'不一樣。我認爲MS會非常幼稚,把如此危險的東西帶入EF。你確定我的方法確實存在問題嗎? – user2173353

+0

例如,請看這裏:http://stackoverflow.com/a/17861166/2173353(我希望我能在MSDN中找到關於這個的例子)。 – user2173353

+0

我現在沒有時間對它進行測試,我個人盡我所能對參數進行處理,然後再將它們傳遞給ORM,以防萬一......無論如何,無論安全問題與否,解析的日期和傳遞它作爲參數應該解決您的問題,在這個答案中提供... – veljkoz

1

您可以將存儲的日期時間或者在長(teaks)或實數(數量:

相反,你應該通過傳遞參數給存儲過程作爲實際參數,例如像這樣打電話當你的演員日期時間變爲真實時)。然後,您可以將這些值轉換爲任何文化而不會有任何損失。

+0

謝謝,但我不能改變數據庫。 :) – user2173353

相關問題