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