Reporting Services系列五:WebService接口
生活随笔
收集整理的這篇文章主要介紹了
Reporting Services系列五:WebService接口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ReportingServices提供WebService接口,基本上所有報表的操作都可以利用它們完成,以下在代碼演示如何使用它們進行報表的導出、報表的訂閱等。其中報表訂閱中的“郵件訂閱”未經過實際測試,其它代碼都經過測試,沒有發現什么問題。當然方法只是給出個原理,沒有什么真正實用價值,有興趣的人可以根據自己的需求對接口進行包裝。
在動手寫代碼之前,你要添加對此WebService的引用,如圖:
//
代碼如下:
?
????public?class?RsWebServiceHelper
????{
????????private?ReportingService?mRService;
????????public?RsWebServiceHelper()
????????{????????????
????????????this.mRService=new?ReportingService();
????????????//Web?Service認證可以使用Windows認證和基本認證。
????????????//如報表服務器上reportserver目錄直接使用具備admin權限的用戶匿名訪問
????????????//則二者都可,且用戶名密碼可隨意,否則,請指定OS中具有權限的用戶名密碼
????????????//Windows?認證:(默認采用NETWORK?SERVICE用戶(win2003),權限不足)
????????????//this.mRService.Credentials?=System.Net.CredentialCache.DefaultCredentials;
????????????//基本認證:
????????????this.mRService.Credentials?=new?System.Net.NetworkCredential("myhuang","123");
????????}
????????/**////?<summary>
????????///?獲取報表項目列表
????????///?</summary>
????????///?<returns></returns>
????????public?DataTable?ListFolders()
????????{
????????????DataTable?dt=new?DataTable();
????????????dt.Columns.Add("ReportName",typeof(System.String));
????????????dt.Columns.Add("ReportPath",typeof(System.String));
????????????foreach(CatalogItem?ci?in?this.mRService.ListChildren("/",false))
????????????{
????????????????if(ci.Type?==ItemTypeEnum.Folder)
????????????????{
????????????????????dt.Rows.Add(new?object[]{ci.Name,ci.Path});
????????????????}
????????????}
????????????return?dt;
????????}
????????/**////?<summary>
????????///?獲取報表列表
????????///?</summary>
????????///?<param?name="pTargetName">報表項目名稱</param>
????????///?<returns></returns>
????????public?DataTable?ListReports(string?pTargetName)
????????{
????????????DataTable?dt=new?DataTable();
????????????dt.Columns.Add("ReportName",typeof(System.String));
????????????dt.Columns.Add("ReportPath",typeof(System.String));
????????????foreach(CatalogItem?ci?in?this.mRService.ListChildren("/"+pTargetName,false))
????????????{
????????????????if(ci.Type?==ItemTypeEnum.Report)
????????????????{
????????????????????dt.Rows.Add(new?object[]{ci.Name,ci.Path});
????????????????}
????????????}
????????????return?dt;
????????}
????????
????????/**////?<summary>
????????///?報表導出
????????///?</summary>
????????///?<param?name="pReportPath">報表全路徑</param>
????????///?<param?name="pParams">報表參數</param>
????????///?<param?name="pFormat">導出格式</param>
????????///?<param?name="pExpPath">導出路徑</param>
????????///?<returns></returns>
????????public?bool?ExportReport(string?pReportPath,string[][]?pParams,string?pFormat,string?pExpPath)
????????{
????????????string?encoding;
????????????string?mimetype;
????????????ParameterValue[]?pvout;
????????????Warning[]?warmings;
????????????string[]?streamid;
????????????ParameterValue[]?pv?=?null;
????????????if(pParams!=null)
????????????{
????????????????pv=new?ParameterValue[pParams.Length];
????????????????for(int?i=0;i<pParams.Length;i++)
????????????????{
????????????????????pv[i]=new?ParameterValue();
????????????????????pv[i].Name=pParams[i][0];
????????????????????pv[i].Value=pParams[i][1];
????????????????}
????????????}
????????????try
????????????{
????????????????byte[]?bytes=this.mRService.Render(pReportPath,pFormat,null,null,pv,null,null,out?encoding,out?mimetype,out?pvout,out?warmings,out?streamid);
????????????????using(FileStream?fs=File.Create(pExpPath,bytes.Length))
????????????????{
????????????????????fs.Write(bytes,0,bytes.Length);
????????????????}
????????????????return?true;
????????????}
????????????catch
????????????{
????????????????return?false;
????????????}
????????}
????????
????????/**////?<summary>
????????///?報表導出
????????///?</summary>
????????///?<param?name="pReportPath">報表全路徑</param>
????????///?<param?name="pFormat">導出格式</param>
????????///?<param?name="pExpPath">導出路徑</param>
????????///?<returns></returns>
????????public?bool?ExportReport(string?pReportPath,string?pFormat,string?pExpPath)
????????{
????????????bool?rt=ExportReport(pReportPath,null,pFormat,pExpPath);
????????????return?rt;
????????}
????????/**////?<summary>
????????///?以共享文件方式訂閱報表
????????///?</summary>
????????///?<param?name="pReport">報表全路徑</param>
????????///?<param?name="pParams">報表參數</param>
????????///?<param?name="pStartTime">訂閱開始時間</param>
????????///?<param?name="pFileName">產生的文件名稱</param>
????????///?<param?name="pShareFolderPath">共享文件夾路徑</param>
????????///?<param?name="pFormat">生成文件格式</param>
????????///?<param?name="pUser">用戶名</param>
????????///?<param?name="pPwd">密碼</param>
????????///?<param?name="pResult">訂閱結果</param>
????????///?<returns></returns>
????????public?bool?SubscriptionFileShare(string?pReport,string[][]?pParams,DateTime?pStartTime,string?pFileName,string?pShareFolderPath,string?pFormat,string?pUser,string?pPwd,out?string?pResult)
????????{????????????
????????????RecurrencePattern,用于指定schedule的周期類型#region?RecurrencePattern,用于指定schedule的周期類型
????????????//繼承于“RecurrencePattern”類:
????????????/**//*MinuteRecurrence?
????????????Represents?the?interval,?in?minutes,?on?which?a?scheduled?report?runs.
????????????//屬性:MinutesInterval??The?interval,?in?minutes,?at?which?a?scheduled?report?runs?
?????????????
????????????DailyRecurrence?
????????????Represents?the?interval,?in?days,?on?which?a?scheduled?report?runs.
????????????//屬性:DaysInterval??The?intervals?at?which?a?scheduled?report?runs.?Intervals?are?specified?in?days?
?????????????
????????????WeeklyRecurrence?
????????????Represents?the?weeks?interval?and?the?days?of?the?week?on?which?a?scheduled?report?runs.
????????????//屬性:DaysOfWeek??The?days?of?the?week?(DaysOfWeekSelector?object)?on?which?a?scheduled?report?runs.?
????????????//WeeksInterval??The?intervals?at?which?a?scheduled?report?runs.?Intervals?are?measured?in?weeks.??
????????????//WeeksIntervalSpecified??Indicates?whether?the?WeeksInterval?value?is?specified.?
????????????MonthlyRecurrence?
????????????Represents?the?days?of?the?month?on?which?a?scheduled?report?runs.
????????????//屬性:Days??Gets?or?sets?the?days?of?the?month?on?which?a?scheduled?report?runs.?
????????????//MonthsOfYear??Gets?or?sets?the?months?of?the?year?(MonthsOfYearSelector?object)?in?which?a?scheduled?report?runs.?
????????????MonthlyDOWRecurrence?
????????????Represents?the?day?of?week,?the?week?number?in?the?month,?and?the?month?on?which?a?scheduled?report?runs.
????????????//屬性:*/
????????????#endregion
????????????//訂閱的觸發條件:時間周期完成時觸發、快照方式(??)
????????????string?eventType?=?"TimedSubscription";
????????????//string?evetnType="SnapshotUpdated";
????????????ExtensionSettings?es=new?ExtensionSettings();
????????????//ReportingServices的兩種訂閱方式:共享文件方式、發送郵件方式
????????????es.Extension?="Report?Server?FileShare";
????????????
????????????//通過ScheduleDefinition類指定sd的起始執行時間
????????????ScheduleDefinition?sd?=?new?ScheduleDefinition();
????????????sd.StartDateTime?=?pStartTime;
????????????//也可指定計劃的結束時間:
????????????//sd.EndDate=DateTime.Now.AddMonths(2);
????????????//sd.EndDateSpecified?=?true;
????????????//通過DailyRecurrence類指定sd的周期類型
????????????DailyRecurrence?dr=new?DailyRecurrence();
????????????dr.DaysInterval?=1;
????????????sd.Item?=dr;
????????????一個比較復雜的周期類型#region?一個比較復雜的周期類型
????????????/**//*
????????????MonthlyDOWRecurrence?pattern?=?new?MonthlyDOWRecurrence();
????????????pattern.WhichWeekSpecified?=?true;
????????????pattern.WhichWeek?=?WeekNumberEnum.LastWeek;
????
????????????MonthsOfYearSelector?months?=?new?MonthsOfYearSelector();
????????????months.March?=?true;
????????????months.June?=?true;
????????????months.September?=?true;
????????????months.December?=?true;
????????????pattern.MonthsOfYear?=?months;
????????????DaysOfWeekSelector?days?=?new?DaysOfWeekSelector();
????????????days.Friday?=?true;
????????????pattern.DaysOfWeek?=?days;*/
????????????#endregion
????????????XmlDocument?doc?=?this.GetScheduleAsXml(sd);???????
????????????string?matchData?=?doc.OuterXml;
????????????可手寫sd的xml定義#region?可手寫sd的xml定義
????????????/**//*
????????????string?scheduleXml=@"<ScheduleDefinition>";
????????????scheduleXml+="<StartDateTime>2006-12-25T16:40:00</StartDateTime>";//時區不用
????????????scheduleXml+="<DailyRecurrence>";
????????????scheduleXml+="<DaysInterval>1</DaysInterval>";
????????????//matchdate+="<DaysOfWeek><Monday>True</Monday></DaysOfWeek>";
????????????scheduleXml+="</DailyRecurrence>";
????????????scheduleXml+="</ScheduleDefinition>";*/
????????????#endregion
????????????共享文件訂閱所需“擴展參數”#region?共享文件訂閱所需“擴展參數”
????????????ParameterValue[]?pv?=?new?ParameterValue[7];
????????????//文件名
????????????pv[0]?=?new?ParameterValue();
????????????pv[0].Name?=?"FILENAME";
????????????pv[0].Value?=?pFileName;
????????????//是否自動添加擴展名,"True"或"False"
????????????pv[1]?=?new?ParameterValue();
????????????pv[1].Name?=?"FILEEXTN";
????????????pv[1].Value?=?"True";
????????????//共享文件夾路徑
????????????pv[2]?=?new?ParameterValue();
????????????pv[2].Name?=?"PATH";
????????????pv[2].Value?=?pShareFolderPath;
????????????//文件類型,"MHTML"?"HTML3.2"?"PDF","CSV","EXCEL","HTML4.0"??"MHTML"??"IMAGE"??"XML"
????????????pv[3]?=?new?ParameterValue();
????????????pv[3].Name?=?"RENDER_FORMAT";
????????????pv[3].Value?=?pFormat;
????????????//須提供OS中具備對該文件夾寫權限的用戶、密碼
????????????pv[4]?=?new?ParameterValue();
????????????pv[4].Name?=?"USERNAME";
????????????pv[4].Value?=?pUser;
????????????pv[5]?=?new?ParameterValue();
????????????pv[5].Name?=?"PASSWORD";
????????????pv[5].Value?=?pPwd;
????????????//方式:"None","AutoIncrement"(文件名自增),"Overwrite"(覆蓋原文件)
????????????pv[6]?=?new?ParameterValue();
????????????pv[6].Name?=?"WRITEMODE";
????????????pv[6].Value?=?"AutoIncrement";
????????????#endregion?
????????????報表自身參數#region?報表自身參數
????????????ParameterValue[]?pv2?=?null;
????????????if(pParams!=null)
????????????{
????????????????pv2=new?ParameterValue[pParams.Length];
????????????????for(int?i=0;i<pParams.Length;i++)
????????????????{
????????????????????pv2[i]=new?ParameterValue();
????????????????????pv2[i].Name=pParams[i][0];
????????????????????pv2[i].Value=pParams[i][1];
????????????????}
????????????}
????????????#endregion
????????????es.ParameterValues?=pv;
????????????try
????????????{
????????????????string?result=this.mRService.CreateSubscription(pReport,?es,?null,?eventType,?matchData,?pv2);
????????????????pResult?=result;//訂閱的ID
????????????????return?true;
????????????}
????????????catch?(System.Web.Services.Protocols.SoapException?ex)
????????????{
????????????????pResult=ex.Detail.InnerXml.ToString();
????????????????return?false;
????????????}????????
????????}
????????/**////?<summary>
????????///?以郵件方式訂閱報表
????????///?</summary>
????????///?<param?name="pReport">報表全路徑</param>
????????///?<param?name="pParams">報表參數</param>
????????///?<param?name="pStartTime">訂閱開始時間</param>
????????///?<param?name="pSendTo">發送人</param>
????????///?<param?name="pReplyTo">抄送人</param>
????????///?<param?name="pFormat">發送文件格式</param>
????????///?<param?name="pResult">訂閱結果</param>
????????///?<returns></returns>
????????public?bool?SubscriptionEmail(string?pReport,string[][]?pParams,DateTime?pStartTime,string?pSendTo,string?pReplyTo,string?pFormat,out?string?pResult)
????????{
????????????//訂閱的觸發條件:時間周期完成時觸發、快照方式(??)
????????????string?eventType?=?"TimedSubscription";
????????????//string?evetnType="SnapshotUpdated";
????????????ExtensionSettings?es=new?ExtensionSettings();
????????????//ReportingServices的兩種訂閱方式:共享文件方式、發送郵件方式
????????????es.Extension="Report?Server?Email";
????????????
????????????//通過ScheduleDefinition類指定sd的起始執行時間
????????????ScheduleDefinition?sd?=?new?ScheduleDefinition();
????????????sd.StartDateTime?=?pStartTime;
????????????//通過DailyRecurrence類指定sd的周期類型
????????????DailyRecurrence?dr=new?DailyRecurrence();
????????????dr.DaysInterval?=1;
????????????sd.Item?=dr;
????????????XmlDocument?doc?=?this.GetScheduleAsXml(sd);???????
????????????string?matchData?=?doc.OuterXml;
????????????郵件訂閱所需“擴展參數”#region?郵件訂閱所需“擴展參數”
????????????ParameterValue[]?pv?=?new?ParameterValue[8];
????????????pv[0]?=?new?ParameterValue();//收件人郵件地址
????????????pv[0].Name?=?"TO";
????????????pv[0].Value?=?pSendTo;
????????????pv[1]?=?new?ParameterValue();//抄送郵件地址
????????????pv[1].Name?=?"ReplyTo";
????????????pv[1].Value?=?pReplyTo;
????????????pv[2]?=?new?ParameterValue();
????????????pv[2].Name?=?"IncludeReport";
????????????pv[2].Value?=?"True";
????????????pv[3]?=?new?ParameterValue();
????????????pv[3].Name?=?"RenderFormat";
????????????pv[3].Value?=?pFormat;
????????????pv[4]?=?new?ParameterValue();
????????????pv[4].Name?=?"Subject";
????????????pv[4].Value?=?"@ReportName?was?executed?at?@ExecutionTime";
????????????pv[5]?=?new?ParameterValue();
????????????pv[5].Name?=?"Comment";
????????????pv[5].Value?=?"Here?is?your?daily?sales?report?for?Michael.";
????????????pv[6]?=?new?ParameterValue();
????????????pv[6].Name?=?"IncludeLink";
????????????pv[6].Value?=?"True";
????????????pv[7]?=?new?ParameterValue();
????????????pv[7].Name?=?"Priority";
????????????pv[7].Value?=?"NORMAL";
????????????#endregion
????????????報表自身參數#region?報表自身參數
????????????ParameterValue[]?pv2?=?null;
????????????if(pParams!=null)
????????????{
????????????????pv2=new?ParameterValue[pParams.Length];
????????????????for(int?i=0;i<pParams.Length;i++)
????????????????{
????????????????????pv2[i]=new?ParameterValue();
????????????????????pv2[i].Name=pParams[i][0];
????????????????????pv2[i].Value=pParams[i][1];
????????????????}
????????????}
????????????#endregion
????????????es.ParameterValues?=pv;
????????????try
????????????{
????????????????string?result=this.mRService.CreateSubscription(pReport,?es,?null,?eventType,?matchData,?pv2);
????????????????pResult?=result;//訂閱的ID
????????????????return?true;
????????????}
????????????catch?(System.Web.Services.Protocols.SoapException?ex)
????????????{
????????????????pResult=ex.Detail.InnerXml.ToString();
????????????????return?false;
????????????}????????
????????}
????????
????????/**////?<summary>
????????///?目前Reporting?Services2000?SP2?
????????///?序列化任務計劃的XML存在與Reporing?Services?API的WhichWeek定義不一致的情況,?
????????///?所以當schedule中涉及whichweek時,需要進行如下處理:
????????///?</summary>
????????///?<param?name="schedule"></param>
????????///?<returns></returns>
????????private?XmlDocument?GetScheduleAsXml(ScheduleDefinition?pSchedule)
????????{
????????????MemoryStream?buffer?=?new?MemoryStream();
????????????XmlSerializer?xmlSerializer?=?new?XmlSerializer(typeof(ScheduleDefinition));
????????????xmlSerializer.Serialize(buffer,?pSchedule);
????????????buffer.Seek(0,?SeekOrigin.Begin);
????????????????????
????????????XmlDocument?doc?=?new?XmlDocument();????????
????????????doc.Load(buffer);???
????????????//patch?up?WhichWeek
????????????XmlNamespaceManager?ns?=?new?XmlNamespaceManager(doc.NameTable);
????????????ns.AddNamespace("rs",?????"http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices");
????????????XmlNode?node?=?doc.SelectSingleNode("/ScheduleDefinition/rs:MonthlyDOWRecurrence/rs:WhichWeek",?ns);
????????????if(node?!=?null)
????????????{
????????????????switch?(node.InnerXml)
????????????????{
????????????????????case?"FirstWeek":
????????????????????????node.InnerXml?=?"FIRST_WEEK";?break;
????????????????????case?"SecondWeek":
????????????????????????node.InnerXml?=?"SECOND_WEEK";?break;
????????????????????case?"ThirdWeek":
????????????????????????node.InnerXml?=?"THIRD_WEEK";?break;
????????????????????case?"FourthWeek":
????????????????????????node.InnerXml?=?"FOURTH_WEEK";?break;
????????????????????case?"LastWeek":
????????????????????????node.InnerXml?=?"LAST_WEEK";?break;
????????????????}
????????????}
????????????return?doc;
????????}
????}
測試代碼:
????????private?void?btExp_Click(object?sender,?System.EventArgs?e)
????????{
????????????RsWebServiceHelper?h=new?RsWebServiceHelper();
????????????string[][]?pv=new?string[4][];
????????????pv[0]=new?string[2]{"start_time","2007-02-01"};
????????????pv[1]=new?string[2]{"end_time","2007-03-01"};
????????????pv[2]=new?string[2]{"note","20"};
????????????pv[3]=new?string[2]{"RsName","Alarm"};
????????????bool?rt=h.ExportReport("/pReports/AlarmLevel",pv,"Excel",@"e:\myhuang\rs.xls");
????????????if(rt)
????????????{
????????????????Response.Write("<script?language=javascript>window.alert('ok');</script>");
????????????}
????????????else
????????????{
????????????????Response.Write("<script?language=javascript>window.alert('failed');</script>");
????????????}
????????}
????????private?void?btSubs_Click(object?sender,?System.EventArgs?e)
????????{
????????????string[][]?pv=new?string[4][];
????????????pv[0]=new?string[2]{"start_time","2007-02-01"};
????????????pv[1]=new?string[2]{"end_time","2007-03-01"};
????????????pv[2]=new?string[2]{"note","20"};
????????????pv[3]=new?string[2]{"RsName","Alarm"};
????????????RsWebServiceHelper?h=new?RsWebServiceHelper();
????????????string?rtout;
????????????bool?rt=h.SubscriptionFileShare("/pReports/AlarmLevel",pv,DateTime.Now.AddMinutes(1),"subsnew",@"e:\myhuang\RsShareFolder","EXCEL","myhuang","123",out?rtout);
????????????if(rt)
????????????{
????????????????Response.Write("<script?language=javascript>window.alert('succeed:"+rtout+"');</script>");
????????????}
????????????else
????????????{
????????????????Response.Write("<script?language=javascript>window.alert('error:"+rtout+"');</script>");
????????????}
????????}
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Reporting Services系列五:WebService接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无工具arp病毒检测
- 下一篇: 登尼特