代码之家  ›  专栏  ›  技术社区  ›  niks

编程c#代码以创建SSRS数据驱动订阅

  •  0
  • niks  · 技术社区  · 7 年前

    我在SQL Reporting service 2012标准版下有带参数的SSRS报告。我喜欢导出到excel,并在电子邮件中作为附件发送到不同的收据,收据来自一些SQL查询,这意味着它是动态的。

    数据驱动订阅可以做到这一点,但我有SQL Server 2012标准版,它不支持数据驱动订阅,我不能升级,所以我正在寻找任何代码,可以做类似的工作,如数据驱动订阅。

    我发现这个链接解决了我的问题。 http://jaliyaudagedara.blogspot.com/2012/10/creating-data-driven-subscription.html

    当我在visual studio 2015“类库”项目下通过添加服务引用来尝试这段代码时 http://mylocalserver:81/reportserver/ReportService2010.asmx “我在这行代码中遇到了一个错误。 ReportingService2010SoapClient rs=新的ReportingService2010SoapClient();

    有关错误的其他信息:找不到引用合同“ReportService2010”的默认端点元素。ServiceModel客户端配置部分中的ReportingService2010Soap。这可能是因为找不到应用程序的配置文件,或者在客户端元素中找不到与此约定匹配的端点元素。

    在花了足够的时间使它与“类库”项目一起工作之后,我决定通过添加web服务引用来完成web服务项目下的代码。经过一些尝试和错误,我终于在web服务项目下获得了工作代码。下面的代码在我的本地机器上运行,该机器有Sql server 2012 enterprise edition,但它给了我同样的错误,即在我的公司服务器上(该服务器有Sql server 2012 standard edition),此版本的Reporting Services不支持“数据驱动的报表订阅”。

       public void DoWork()
        {
           ReportingService2010 rs = new ReportingService2010();
            rs.Credentials = CredentialCache.DefaultCredentials;
           // rs.Url = "http://mylocalserver:81/reportserver/ReportService2010.asmx";
            rs.Url = "http://companyserver/reportserver/ReportService2010.asmx";
    
            var reportPath = "/CYTYC Reports/";
    
            string report = $"{reportPath}AllContactCIPPointsReport";
            string description = "Programmatic Data Driven Subscription \"Report Server Email\" ";
    
            //set extension as Windows File Share
            ExtensionSettings settings = new ExtensionSettings();
            settings.Extension = "Report Server Email";
    
    
            // Set the extension parameter values.
            var extensionParams = new ParameterValueOrFieldReference[8];
    
            // var to = new ParameterFieldReference { ParameterName = "TO", FieldAlias = "PARAMS" }; // Data-driven.
            var to = new ParameterValue { Name = "TO", Value = "example@gmail.com" }; // Data-driven.
            extensionParams[0] = to;
    
            var replyTo = new ParameterValue { Name = "ReplyTo", Value = "example@gmail.com" };
            extensionParams[1] = replyTo;
    
            var includeReport = new ParameterValue { Name = "IncludeReport", Value = "False" };
            extensionParams[2] = includeReport;
    
            var renderFormat = new ParameterValue { Name = "RenderFormat", Value = "HTML4.0" };
            extensionParams[3] = renderFormat;
    
            var priority = new ParameterValue { Name = "Priority", Value = "NORMAL" };
            extensionParams[4] = priority;
    
            var subject = new ParameterValue { Name = "Subject", Value = "Subsribed Report" };
            extensionParams[5] = subject;
    
            var comment = new ParameterValue { Name = "Comment", Value = "Here is the link to your report." };
            extensionParams[6] = comment;
    
            var includeLink = new ParameterValue { Name = "IncludeLink", Value = "True" };
            extensionParams[7] = includeLink;
    
            settings.ParameterValues = extensionParams;
    
            // Create the data source for the delivery query.
            var delivery = new DataSource { Name = "" };
            var dataSourceDefinition = new DataSourceDefinition
            {
                ConnectString = "Data Source=CYTYC-LIVE;Initial Catalog=yourdatabasename",
                CredentialRetrieval = CredentialRetrievalEnum.Store,
                Enabled = true,
                EnabledSpecified = true,
                Extension = "SQL",
                ImpersonateUserSpecified = false,
                UserName = "username",
                Password = "password"
            };
            delivery.Item = dataSourceDefinition;
    
            // Create the data set for the delivery query.
            var dataSetDefinition = new DataSetDefinition
            {
                AccentSensitivitySpecified = false,
                CaseSensitivitySpecified = false,
                KanatypeSensitivitySpecified = false,
                WidthSensitivitySpecified = false
            };
            var queryDefinition = new QueryDefinition
            {
                CommandText = @"Your select * from Query",
                CommandType = "Text",
                Timeout = 45,
                TimeoutSpecified = true
            };
            dataSetDefinition.Query = queryDefinition;
            var results = new DataSetDefinition();
            var oServerInfoHeader = new ServerInfoHeader();
            var oTrustedUserHeader = new TrustedUserHeader();
    
            bool changed;
            string[] paramNames;
            try
            {
                results = rs.PrepareQuery(delivery, dataSetDefinition, out changed, out paramNames);//.PrepareQuery(oTrustedUserHeader, delivery, dataSetDefinition, out results, out changed,out paramNames);
    
            }
            catch (Exception ex)
            {
    
                Console.WriteLine(ex.Message);
            }
    
            var dataRetrieval = new DataRetrievalPlan { DataSet = results, Item = dataSourceDefinition };
    
    
            // Set the event type and match data for the delivery.
            const string eventType = "TimedSubscription";
            const string matchData = "<ScheduleDefinition><StartDateTime>2018-06-01T14:00:00-07:00</StartDateTime><WeeklyRecurrence><WeeksInterval>1</WeeksInterval><DaysOfWeek><Monday>True</Monday><Tuesday>True</Tuesday><Wednesday>True</Wednesday><Thursday>True</Thursday><Friday>True</Friday></DaysOfWeek></WeeklyRecurrence></ScheduleDefinition>";
    
            //const string eventType = "SnapshotUpdated";
            //const string matchData = null;
    
            //// Set the report parameter values.
            //var parameters = new ParameterValueOrFieldReference[1];
    
            //// i am retrieving value EMAIL from database and I am passing that value as my report parameter value
            //var reportparam = new ParameterFieldReference { ParameterName = "yourreportparametername", FieldAlias = "PARAMS" }; // Data-driven.
    
            //parameters[0] = reportparam;
    
            var parameters = new ParameterValue[1];
            var reportparam = new ParameterValue {Name = "yourreportparametername", Value = "yourreportparametervalue"};
            parameters[0] = reportparam;
    
            string subscriptionId = "";
            try
            {
    
                subscriptionId = rs.CreateDataDrivenSubscription(report, settings, dataRetrieval, description, eventType, matchData, parameters);
                //(oTrustedUserHeader, report, settings, dataRetrieval,description, eventType, matchData, parameters,out subscriptionId);
            }
            catch (System.Web.Services.Protocols.SoapException ex)
            {
                Console.WriteLine(ex.Detail.InnerText.ToString(CultureInfo.InvariantCulture));
            }
    
        }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Hannover Fist    7 年前

    您不会说为什么需要数据驱动订阅——常规SSRS订阅可以通过电子邮件发送带有设置或默认参数的Excel报告。

    据我所知,没有任何第三方工具可以模拟数据驱动订阅,但也有一些用户创建了自己的订阅。

    如果只想根据条件触发订阅,可以使用SSIS作业来运行查询,以确定是否发送,如果是,则触发订阅。

    Something like Data Driven Subscriptions SSRS Standard Edition 2008

    如果您需要更复杂的内容(如更改为/CC收件人、更改参数值…),你需要做更多的编程。以下是一些理论和代码的入门内容:

    https://www.mssqltips.com/sqlservertip/4249/simulate-reporting-services-data-driven-subscriptions-on-unsupported-editions/

    http://www.sqlservercentral.com/articles/Reporting+Services+(SSRS)/163119/