【问题标题】:Programmatically exporting reports from SQL 2012 Reporting Services以编程方式从 SQL 2012 Reporting Services 导出报表
【发布时间】:2012-08-30 15:07:09
【问题描述】:

我有一个控制台应用程序需要连接到 SQL Server Express 2012 上的 SQL Reporting Services。 所有的导出逻辑都应该在一个单独的 dll 中实现,并且路径应该是动态的(我已经循环了各种服务器/报告的各种设置,并将它们一一导出到 Excel)。

我尝试遵循这些教程:

http://www.aspose.com/docs/display/wordsreportingservices/Rendering+Reports+Programmatically

http://blogs.msdn.com/b/selvar/archive/2010/12/13/accessing-the-reportexecutionservice-render-method-when-reporting-service-2008-r2-is-in-forms-based-authentication.aspx

基本上,我添加了网络参考:

http://localhost:80/ReportServer_SQLEXPRESS12/ReportExecution2005.asmx

http://localhost:80/ReportServer_SQLEXPRESS12/ReportService2010.asmx

到我的 dll。到目前为止看起来不错,除了那些讨厌的 app.config 设置(稍后我将不得不动态调整它们)。

然后我尝试按照示例中的方式进行操作:

// Create Web service proxies.
ReportingService2010.ReportingService2010 rs = new ReportingService2010.ReportingService2010();
ReportExecutionService.ReportExecutionService rsExec = new ReportExecutionService.ReportExecutionService();

遇到了一些麻烦:

Error   76  The type or namespace name 'ReportExecutionService' does not exist in the namespace 'MyDllNamespace.ReportExecutionService' (are you missing an assembly reference?)    

Error   74  The type or namespace name 'ReportingService2010' does not exist in the namespace 'MyDllNamespace.ReportingService2010' (are you missing an assembly reference?)

现在我下一步该去哪里,如果我什至无法创建代理对象,我该如何使用 Reporting Services API?或者我应该更好地使用 Winforms ReportViewer 中的 ServerReport 类而不是这些 Web 引用?

即使是 Microsoft 的一个示例也是在控制台应用程序中使用 ReportViewer,但在控制台应用程序中导入 Winforms 似乎有点尴尬。

【问题讨论】:

标签: c# web-services reporting-services sql-server-2012


【解决方案1】:

我希望以下内容会有所帮助(提取代码的相关部分)

            using (ZUtilities.SSRS.Report report = new ZUtilities.SSRS.Report {
                ReportServerPath = VParameter.GetValue("SSRS_WebServiceUrl", _repo.Parameters).ToString(),
                Format = rformat,
                ReportPath = "some_path_on_ssrs_server"
            }) {
                report.Params.Add("Id", id.ToString());
                report.Credentials = nwc;
                MemoryStream ms = new MemoryStream();
                report.Render().CopyTo(ms);
                FileContentResult fsr = new FileContentResult(ms.ToArray(), rctype);
                fsr.FileDownloadName = String.Format("EPV-{0}-{1:yyyyMMdd}.{2}", epv.ExternalReference, DateTime.Now, fext);
                ms.Close();
                return fsr;
            }

以下(注意流管理)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace ZUtilities.SSRS {
    public enum ReportFormats {
        Html = 1,
        MHtml,
        Pdf,
        Xlsx,
        Docx
    }

    public class ReportFormat {
        static ReportFormat() {
            Html = new ReportFormat { Code = ReportFormats.Html, Instruction = "HTML4.0" };
            MHtml = new ReportFormat { Code = ReportFormats.MHtml, Instruction = "MHTML" };
            Pdf = new ReportFormat { Code = ReportFormats.Pdf, Instruction = "PDF" };
            Xlsx = new ReportFormat { Code = ReportFormats.Xlsx, Instruction = "EXCELOPENXML" };
            Docx = new ReportFormat { Code = ReportFormats.Docx, Instruction = "WORDOPENXML" };
        }

        private ReportFormat() {
        }

        public ReportFormats Code { get; set; }
        public String Instruction { get; set; }

        public static ReportFormat Html { get; private set; }
        public static ReportFormat MHtml { get; private set; }
        public static ReportFormat Pdf { get; private set; }
        public static ReportFormat Xlsx { get; private set; }
        public static ReportFormat Docx { get; private set; }

        public static ReportFormat ByCode(ReportFormats code) {
            switch (code) {
                case ReportFormats.Html: return Html;
                case ReportFormats.MHtml: return Html; //<<======================
                case ReportFormats.Pdf: return Pdf;
                case ReportFormats.Xlsx: return Xlsx;
                case ReportFormats.Docx: return Docx;
                default : return null;
            }
        }
    }

    public class Report : IDisposable {
        private HttpWebRequest _httpWReq;
        private WebResponse _httpWResp;

        public Report() {
            _httpWReq = null;
            _httpWResp = null;
            Format = ReportFormats.Html;
            Params = new Dictionary<String, String>();
        }

        public Dictionary<String, String> Params { get; set; }

        public String ReportServerPath { get; set; }
        public String ReportPath { get; set; }
        public ReportFormats Format { get; set; }
        public NetworkCredential Credentials { get; set; }

        //public String PostData { get { return String.Format("rs:Command=Render&rs:Format={0}", ReportFormat.ByCode(Format).Instruction); } }
        public String PostData { get {
            StringBuilder sb = new StringBuilder(1024);
            sb.AppendFormat("rs:Command=Render&rs:Format={0}", ReportFormat.ByCode(Format).Instruction);
            if (Format == ReportFormats.Html) {
                sb.Append("&rc:Toolbar=false");
            }
            foreach (var kv in Params) {
                sb.AppendFormat("&{0}={1}", kv.Key, kv.Value);
            }

            return sb.ToString();
        } }

        public String ReportFullPath { get { return ReportServerPath + "?/" +  ReportPath; } }

        public Stream Render() {
            _httpWReq = (HttpWebRequest)HttpWebRequest.Create(ReportFullPath);
            _httpWReq.Method = "POST";
            if (Credentials != null)
                _httpWReq.Credentials = Credentials;

            byte[] byteArray = Encoding.UTF8.GetBytes(PostData);
            _httpWReq.ContentType = "application/x-www-form-urlencoded";
            _httpWReq.ContentLength = byteArray.Length;
            Stream dataStream = _httpWReq.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            if (_httpWResp != null )
                _httpWResp.Close();
                            _httpWResp = _httpWReq.GetResponse();               

            return _httpWResp.GetResponseStream();
        }

        public void RenderTo(String fileName) {            
            Stream receiveStream = Render();
            Stream ds = File.Open(fileName, FileMode.Create);
            receiveStream.CopyTo(ds);
            ds.Close();
            receiveStream.Close();            
        }

        public void Dispose() {
            if (_httpWResp != null) {
                _httpWResp.Close();
                _httpWResp = null;
            }

            if (_httpWReq != null) {
                _httpWReq = null;
            }
        }
    }
}

【讨论】:

  • 嗨,我正在尝试使用上面的代码,保存时收到损坏的 PDF 或 Excel 文件。知道为什么吗?谢谢
  • 你使用 Render 还是 RenderTo。如果您使用 Render,则返回的流可能缺少 close()。
  • 关闭就在那里。然而还是同样的问题。
  • 收盘前可能是同花顺?
  • 我也得到了一个损坏的文件 - 但我没有使用 FileContentResult 所以这可能是我的实施问题。 Adobe Reader 无法打开“test.pdf”,因为它不是受支持的文件类型或文件已损坏(例如,它作为电子邮件附件发送且未正确解码)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多