2015-05-07 37 views
0

我有一个Asp.net表单与水晶报表查看器控制它。水晶报表数据库登录失败错误,当转到下一页

在Page_Load事件中,我正在加载一个报告&从数据库设置数据源。

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     DataTable dt= Custom.StaticGeneral.GetDataTable("Select top 100 * From CustVend order by Code desc"); 
     dt.TableName = "CustVend"; 
     dt.AcceptChanges(); 

     DataSet ds = new DataSet(); 
     ds.Tables.Add(dt); 
     ds.AcceptChanges(); 


     ReportDocument myReportDocument; 
     myReportDocument = new ReportDocument(); 

     myReportDocument.Load(Server.MapPath("CrystalReport1.rpt")); 

     myReportDocument.SetDataSource(ds); 
     CrystalReportViewer1.ReportSource = myReportDocument; 
     //CrystalReportViewer1.DataBind(); Also Tried This 

     CrystalReportViewer1.DisplayToolbar = true; 
    } 
} 

这是相关的HTML

<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" 
      GroupTreeImagesFolderUrl="" Height="1202px" 
      ReuseParameterValuesOnRefresh="True" EnableDatabaseLogonPrompt="false" 
      ToolbarImagesFolderUrl="" ToolPanelWidth="200px" Width="1104px" /> 

我已经设置EnableDatabaseLogonPrompt =“假”,因为我提供我自己的数据源日志&问题中并不存在。

当页面载入我的数据时,我可以看到报告。 然而,当我选择“转到下一页” Crystal报表查看器控件的链接,错误会弹出

错误:“数据库登录失败。”

看来我错过了什么(可能重新绑定数据集/报告),但不能看着办吧......

我可以通过注释掉如果线路解决了这个错误(!的IsPostBack) 。 但它是再次查询数据库的正确方法&每次用户更改页面时加载整个报告?

还是有简单/更容易可供选择..

+0

如果问题仍未解决,你可以检查HTTP:// stackoverflow.com/a/33304564/5104101 – haraman

回答

0

加载该报告必须在每个回发执行代码。 Page_Init是您可以放置​​此代码的正确位置(Page_Load可能导致一些错误)。


嘿,建议关闭每个页面上的ReportDocument卸载;这避免在报告计数器的不受控制的增长将会停止应用程序

protected void Page_Unload(object sender, EventArgs e) 
    { 
     if (reportDocument != null) 
     reportDocument.Close(); 
    } 
0

将代码放在LoadData方法应该如果被调用(!的IsPostBack)。 IsPostBack用于Ajax调用,并不是CrystalReports的情况。

这是我如何做到这一点:

<CR:CrystalReportSource ID="CrystalReportSource1" runat="server"> 
     <Report FileName="myCristalReport.rpt"></Report> 
</CR:CrystalReportSource> 

<CR:CrystalReportViewer 
         ID="CrystalReportViewer1" 
         runat="server" 
         AutoDataBind="true" 
         EnableDatabaseLogonPrompt="False" 
         EnableParameterPrompt="False" 
         ReportSourceID="CrystalReportSource1" 
         ToolPanelView="None" /> 

和LoadData:

var reportSource = (CrystalReportSource)this.FindControlRecursively("CrystalReportSource1"); 
    reportSource.ReportDocument.SetDatabaseLogon("dbuser", "dbpassword"); 
    reportSource.ReportDocument.SetParameterValue("Month", 2); 

....