[RDLC] VS2010無法維護RDLC 2005 XML Schema報表的解決方式
最近面臨到要以VS2010 開發工具維護舊專案的RDLC報表,這裡所指的舊專案是指以2.0 or 3.5 .Net Framework所開發的專案
在VS2010裡雖然可以不用強制升級原本以2.0 or 3.5 .Net Framework所開發的專案,且可以持續開發及維護,這也是VS2010的
優點之一,換言之它可以支援多版本的.Net Framework專案,但很不幸的若您想維護原有的RDLC 2005格式報表時,您大慨會
遇上如下的強制轉換訊息,而且您無法略過,也就是若您不轉換的話就無法用視覺化的方式調整或設計您原有舊專案的RDLC報表
【強制轉換訊息】
這個問題起源於原先的報表是以RDLC 2005 XML Schema所定義而成的,而9.0版的ReportViewer元件可解析這樣的定義格式,
但在VS2010裡Design Time時僅支援RDLC 2008 XML Schema,且10.0版的ReportViewer元件也僅支援解析RDLC 2008 XML Schema
,在這個情況若選擇不轉換時,則VS2010裡您會看到以下的Design畫面
【VS2010 RDLC Design Error 】
因此在這個情況下,除非放棄以視覺化方式來設計原有的RDLC 2005 XML Schema報表,純以XML方式自行編輯,否則大慨只有
選擇接受強制轉換,但問題來了,當選擇接受強制轉換後,雖然在Design Time時可以正常的編修RDLC報表(長的跟以前不太一樣,
不是太習慣Orz…),但真正部署後會發現報表頁面卻出現了錯誤訊息
【轉換後VS2010 RDLC Design Time畫面】
【Run Time 錯誤訊息】
The report definition is not valid.
Details: The report definition has an invalid target namespace 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition' which cannot be upgraded.
也就是說原本的9.0版ReportViewer元件只能解析RDLC 2005 XML Schema所定義的RDLC報表,這也意味者ReportViewer元件必須
跟著改成10.0版本,10.0版的ReportViewer元件可由VS2010工具箱中找到,不過因為要替換成10.0版的ReportViewer元件,所以
有幾個特別要注意的地方
(1) 改用10.0版的ReportViewer後,在Web.Config裡會增加如下的設定
<buildProviders> <add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </buildProviders>
(2) 另外原本在Web.Config裡有關9.0版的ReportViewer設定,請改為10.0
<!-- <add assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> <add assembly="Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> --> <add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> <add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> <add assembly="Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"/>
<httpHandlers> <!-- <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> --> <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </httpHandlers>
(3) aspx頁面裡Register Assembly也請改為10.0
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
(4) 由於10.0版的ReportViewer元件有使用到Ajax,因此頁面上必須多部署ScriptManager元件,不然執行後會有以下錯誤訊息
最後必須確保在正式的主機,必須把10.0版的DLL註冊到GAC中
完成之後,報表即可正常運行囉,會發現操作介面跟之前版本有點不太一樣,此外也多了轉word的功能
By No.18