C# 如何使用.NET和Oracle以及动态参数导出PDF

C# 如何使用.NET和Oracle以及动态参数导出PDF,c#,asp.net,crystal-reports,parameters,login,C#,Asp.net,Crystal Reports,Parameters,Login,我在出口以下产品时遇到困难。我正在Oracle 10g数据库上运行CR2008SP2和ASP.NET 3.5 如果我没有设置任何参数,那么页面工作得很好,并输出一个pdf(好吧,除了因为没有指定参数,所以它不是我真正想要的数据。但是没有错误)。如果我设置了参数,则会出现以下错误-- 这是我使用的代码 public void LoadReport() { crReportDocument = new ReportDocument();

我在出口以下产品时遇到困难。我正在Oracle 10g数据库上运行CR2008SP2和ASP.NET 3.5

如果我没有设置任何参数,那么页面工作得很好,并输出一个pdf(好吧,除了因为没有指定参数,所以它不是我真正想要的数据。但是没有错误)。如果我设置了参数,则会出现以下错误--

这是我使用的代码

public void LoadReport()
{
                    crReportDocument = new ReportDocument();


                    connectionInfo = new ConnectionInfo();
                    ParameterField paramField1 = new ParameterField();
                    ParameterField paramField2 = new ParameterField();
                    ParameterField paramField3 = new ParameterField();
                    ParameterField paramField4 = new ParameterField();
                    ParameterFields paramFields = new ParameterFields();
                    ParameterDiscreteValue paramDiscreteValue1 = new ParameterDiscreteValue();
                    ParameterDiscreteValue paramDiscreteValue2 = new ParameterDiscreteValue();
                    ParameterDiscreteValue paramDiscreteValue3 = new ParameterDiscreteValue();
                    ParameterDiscreteValue paramDiscreteValue4 = new ParameterDiscreteValue();
                    //p1
                    paramField1.Name = "Siebel Position";
                    paramDiscreteValue1.Value = txtAvailPos.Text;
                    paramField1.CurrentValues.Add(paramDiscreteValue1);
                    paramFields.Add(paramField1);

                    //p2
                    paramField2.Name = "DETAIL_LEVEL";
                    paramDiscreteValue2.Value = ddlDetailLvl.SelectedValue;
                    paramField2.CurrentValues.Add(paramDiscreteValue2);
                    paramFields.Add(paramField2);

                    //p3
                    paramField3.Name = "RPT_MONTH";
                    paramDiscreteValue3.Value = ddlMonth.SelectedValue;
                    paramField3.CurrentValues.Add(paramDiscreteValue3);
                    paramFields.Add(paramField3);
                    //p4
                    paramField4.Name = "RPT_YEAR";
                    paramDiscreteValue4.Value = txtYear.Text;
                    paramField4.CurrentValues.Add(paramDiscreteValue4);
                    paramFields.Add(paramField4);

    //setting these parameters is what will cause login issues
    //crReportDocument.SetParameterValue("Siebel Position", txtAvailPos.Text);
                    //crReportDocument.SetParameterValue("DETAIL_LEVEL", ddlDetailLvl.SelectedValue);
                    //crReportDocument.SetParameterValue("RPT_MONTH", ddlMonth.SelectedValue);
                    //crReportDocument.SetParameterValue("RPT_YEAR", txtYear.Text);


    crReportDocument.Load(Server.MapPath("~/file.rpt"));

    connectionInfo.DatabaseName="tnsnames_entry";
    connectionInfo.UserID="username";
    connectionInfo.Password="password";
    SetPermissions(connectionInfo);
    crReportDocument.ExportToHttpResponse(ExportFormatType.PortableDocFormat,
                        Response, false, "test01");
    crReportDocument.Close();
                    crReportDocument.Dispose();
                    crReportDocument = null;
    }

    private void SetPermissions(ConnectionInfo conInfo)
            {
                Sections crSections = crReportDocument.ReportDefinition.Sections;
                foreach (Section crSection in crSections)
                {
                    foreach (ReportObject crReportObject in crSection.ReportObjects)
                    {
                        if (crReportObject.Kind == ReportObjectKind.SubreportObject)
                        {
                            SubreportObject crSubReportObject = (SubreportObject)crReportObject;
                            ReportDocument subreport=crSubReportObject
                                .OpenSubreport(crSubReportObject.SubreportName);
                            foreach (CrystalDecisions.CrystalReports.Engine.Table subtbl 
                                in subreport.Database.Tables)
                            {
                                TableLogOnInfo objTableLogonInfo = subtbl.LogOnInfo;
                                objTableLogonInfo.ConnectionInfo=conInfo;
                                subtbl.ApplyLogOnInfo(objTableLogonInfo);
                                subtbl.Location=subtbl.Location.Substring
                                    (subtbl.Location.LastIndexOf(".") +1);

                            }
                        }
                    }
                }
            }

原来我们使用的报告是一个旧的Crystal Reports(我想是8)报告,它使用的是.qry文件。在我们将查询转换为命令对象(在crystal中)之后,一切都正常了

public void LoadReport()
{
                    crReportDocument = new ReportDocument();


                    connectionInfo = new ConnectionInfo();
                    ParameterField paramField1 = new ParameterField();
                    ParameterField paramField2 = new ParameterField();
                    ParameterField paramField3 = new ParameterField();
                    ParameterField paramField4 = new ParameterField();
                    ParameterFields paramFields = new ParameterFields();
                    ParameterDiscreteValue paramDiscreteValue1 = new ParameterDiscreteValue();
                    ParameterDiscreteValue paramDiscreteValue2 = new ParameterDiscreteValue();
                    ParameterDiscreteValue paramDiscreteValue3 = new ParameterDiscreteValue();
                    ParameterDiscreteValue paramDiscreteValue4 = new ParameterDiscreteValue();
                    //p1
                    paramField1.Name = "Siebel Position";
                    paramDiscreteValue1.Value = txtAvailPos.Text;
                    paramField1.CurrentValues.Add(paramDiscreteValue1);
                    paramFields.Add(paramField1);

                    //p2
                    paramField2.Name = "DETAIL_LEVEL";
                    paramDiscreteValue2.Value = ddlDetailLvl.SelectedValue;
                    paramField2.CurrentValues.Add(paramDiscreteValue2);
                    paramFields.Add(paramField2);

                    //p3
                    paramField3.Name = "RPT_MONTH";
                    paramDiscreteValue3.Value = ddlMonth.SelectedValue;
                    paramField3.CurrentValues.Add(paramDiscreteValue3);
                    paramFields.Add(paramField3);
                    //p4
                    paramField4.Name = "RPT_YEAR";
                    paramDiscreteValue4.Value = txtYear.Text;
                    paramField4.CurrentValues.Add(paramDiscreteValue4);
                    paramFields.Add(paramField4);

    //setting these parameters is what will cause login issues
    //crReportDocument.SetParameterValue("Siebel Position", txtAvailPos.Text);
                    //crReportDocument.SetParameterValue("DETAIL_LEVEL", ddlDetailLvl.SelectedValue);
                    //crReportDocument.SetParameterValue("RPT_MONTH", ddlMonth.SelectedValue);
                    //crReportDocument.SetParameterValue("RPT_YEAR", txtYear.Text);


    crReportDocument.Load(Server.MapPath("~/file.rpt"));

    connectionInfo.DatabaseName="tnsnames_entry";
    connectionInfo.UserID="username";
    connectionInfo.Password="password";
    SetPermissions(connectionInfo);
    crReportDocument.ExportToHttpResponse(ExportFormatType.PortableDocFormat,
                        Response, false, "test01");
    crReportDocument.Close();
                    crReportDocument.Dispose();
                    crReportDocument = null;
    }

    private void SetPermissions(ConnectionInfo conInfo)
            {
                Sections crSections = crReportDocument.ReportDefinition.Sections;
                foreach (Section crSection in crSections)
                {
                    foreach (ReportObject crReportObject in crSection.ReportObjects)
                    {
                        if (crReportObject.Kind == ReportObjectKind.SubreportObject)
                        {
                            SubreportObject crSubReportObject = (SubreportObject)crReportObject;
                            ReportDocument subreport=crSubReportObject
                                .OpenSubreport(crSubReportObject.SubreportName);
                            foreach (CrystalDecisions.CrystalReports.Engine.Table subtbl 
                                in subreport.Database.Tables)
                            {
                                TableLogOnInfo objTableLogonInfo = subtbl.LogOnInfo;
                                objTableLogonInfo.ConnectionInfo=conInfo;
                                subtbl.ApplyLogOnInfo(objTableLogonInfo);
                                subtbl.Location=subtbl.Location.Substring
                                    (subtbl.Location.LastIndexOf(".") +1);

                            }
                        }
                    }
                }
            }