C# 如何使用.NET和Oracle以及动态参数导出PDF
我在出口以下产品时遇到困难。我正在Oracle 10g数据库上运行CR2008SP2和ASP.NET 3.5 如果我没有设置任何参数,那么页面工作得很好,并输出一个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();
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);
}
}
}
}
}