如何使用c#代码在自定义SSRS渲染器中获得rdl报告参数值

本文关键字:rdl 报告 参数 代码 何使用 自定义 SSRS | 更新日期: 2023-09-27 18:07:20

我为SSRS制作了一个渲染扩展,它以pdf格式生成数字签名和密码保护的报告。目前,我假设用户id来自RDL报告参数,所以我制作了一个带有一个参数的示例RDL报告。我只是想在我的类库项目中使用c#代码获取报告的参数值。

  bool IRenderingExtension.Render(Microsoft.ReportingServices.OnDemandReportRendering.Report report, NameValueCollection reportServerParameters, NameValueCollection deviceInfo, NameValueCollection clientCapabilities, ref System.Collections.Hashtable renderProperties, CreateAndRegisterStream createAndRegisterStream)
        {
            pdfheper = new PDFHelper();
            //Get user id from parameter
            try
            {
                pdfRenderer.Render(report, reportServerParameters, deviceInfo, clientCapabilities, ref renderProperties,
                    new CreateAndRegisterStream(IntermediateCreateAndRegisterStream)
                );
                String tempFile = Path.GetTempPath() + report.Name + ".pdf";
                String tempSigned = Path.GetTempPath() + report.Name + "signed.pdf";
                signer = new PDFSigner(Config.CertFilePath, Config.CertFilePass, tempFile, tempSigned);
                //Stream where report capture
                Stream outputStream = createAndRegisterStream(report.Name, "pdf", Encoding.UTF8, "application/pdf", true, StreamOper.CreateAndRegister);
                intermediateStream.Position = 0;
                pdfheper.SaveStreamToFile(tempFile, intermediateStream);
                //Here get value from report parameter
                int userid = 2;
                RendererDAL dsl = new RendererDAL();
                string userPassword = dsl.GetUserPassword(userid);
                //Add Signature
                    if (signer.AddSignature(userPassword))
                    {
                        // convert pdf to stream
                        intermediateStream = pdfheper.FileToStream(tempSigned);
                        //After apply signature copy stream to output stream
                        byte[] buffer = new byte[32 * 1024];
                        while (true)
                        {
                            int read = intermediateStream.Read(buffer, 0, buffer.Length);
                            if (read <= 0) break;
                            outputStream.Write(buffer, 0, read);
                        }
                        intermediateStream.Close();
                        intermediateStream = null;
                        File.Delete(tempFile);
                        File.Delete(tempSigned);
                    }
            }
            catch (Exception ex)
            {
                MyLogManager.Log(ex.ToString());
            }
        return false;
    }

如何使用c#代码在自定义SSRS渲染器中获得rdl报告参数值

在Render方法的参数列表中有一个reportServerParameters参数。这是

的一个实例

System.Collections.Specialized.NameValueCollection

我想检索参数的代码可能是:

string parameterValue = reportServerParameters.Get(<Parameter Name>);

对于多值形参:

string[] parameterValues = reportServerParameters.GetValues(<Parameter Name>);
https://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx