這個問題也適用於 Microsoft SQL Server 2012 Reporting Services。
症狀
請考慮以下案例:
- 建立以 Microsoft .NET Framework 4.0 為基礎的 Windows Forms 應用程式或Windows Presentation Foundation (WPF) 應用程式。
- 在 Windows Forms 或 WPF 應用程式中,您可以使用 Microsoft Report Viewer 2010 控制項來顯示以遠端模式執行的 Microsoft SQL Server 2012 Reporting Services (SSRS 2012) 報告。
- 報表包含具有預設值的 DateTime 類型參數。
- 您在地區設定設為義大利文的作業系統上執行應用程式。 此外,[完整時間] 格式設定為 “HH:mm:ss”。
在此情境中,您可能會遇到下列其中一個問題:
- [日期時間] 類型參數的預設值不會顯示在參數提示區域中。
- 如果您將值指派給 DateTime 類型參數並更新報表,則該值會在報表轉譯後遺失,且不會顯示。
原因
發生此問題的原因是 .NET Framework 4.0 中的變更阻止應用程式和 SSRS 2012 根據作業系統的區域設定使用正確的資訊。 以 .NET Framework 4.0 為基礎的應用程式會使用 Windows 傳回的地區設定。 不過,SSRS 2012 是以 .NET Framework 3.5 Services Pack 1 (SP1) 為基礎所建置。 因此,SSRS 2012 會使用內嵌於 .NET Framework 3.5 SP1 中的地區設定。
當 SSRS 2012 伺服器使用「.」符號做為時間分隔符號執行報告時,DateTime 類型參數會以字串的方式傳回用戶端。 報表檢視器控制項會呼叫 DateTimeOffset.TryParse 方法,以使用 “:” 符號做為時間分隔符號來驗證字串。 因此,字串會驗證為 false,且不會顯示在參數提示區域中。
注意:只有在完整時間格式設定為義大利地區設定的預設設定 「HH:mm:ss」時,才會發生此問題。 義大利地區設定的預設設定取決於您的作業系統。 此外,您可以透過變更 [完整時間] 格式來設定作業系統的預設設定。
解決方式
累積更新資訊
SQL Server 2012 Service Pack 1 (SP1 的累積更新 2)
此問題的修正程式最初在累積更新 2 中發行。 如需有關如何取得 SQL Server 2012 Service Pack 1 累積更新套件的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
2790947 SQL Server 2012 Service Pack 1 累積更新套件 2 注意:由於這些組建是累積的,因此每個新發行的修正程式都包含先前的 SQL Server 2012 Service Pack 1 修正程式版本中包含的所有 Hotfix 和所有安全性修正程式。 建議您考慮套用包含此 Hotfix 的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:
2772858 在 SQL Server 2012 Service Pack 1 發行之後所發行的 SQL Server 2012 組建 (英文)
狀態
Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。
因應措施
若要解決此問題, 請使用下列其中一種因應措施:
- 設定應用程式與作業系統上的地區設定,以符合用戶端上的地區設定。
- 建立字串輸入欄位,讓使用者填入文字。 然後在報表中,將字串轉換成日期。
- 建立當您執行報表時從字串輸入欄位填入的隱藏參數或無提示參數。
- 建立不可見的 DateTime 類型參數,以及在報表檢視器控制項之外的 DateTimePicker 控制項。 按一下 [檢視報表],然後將字串值放入 SubmittingParameterValues 事件處理常式的 DateTime 類型參數中。
更多資訊
可從下列 Microsoft 下載中心網站下載 Microsoft Report Viewer 2010 SP1 可轉散發套件:
Microsoft Report Viewer 2010 SP1 可轉散發套件 若要深入了解 DateTimeOffset.TryParseExact 方法和 DateTimeOffset.TryParse 方法,請造訪下列 MSDN 網站:
DateTimeOffset.TryParseExact 方法 (String, String, IFormatProvider, DateTimeStyles, DateTimeOffset%)
DateTimeOffset.TryParse 方法 (字串, DateTimeOffset%)