Sql Web Crystal报表生成数据库登录失败

Sql Web Crystal报表生成数据库登录失败,sql,dynamic,crystal-reports,Sql,Dynamic,Crystal Reports,我在本地机器上开发了一个Crystal报表,我可以使用.ExportToHttpResponse在本地网站上呈现该报表,但一旦我将代码移动到生产服务器,就会出现“数据库登录失败”错误。我基本上使用.XML数据集文件作为本地开发报告的源。这是我的密码: 我调用一个方法来呈现报告: private void RenderCrystalReports(string rptName, string pdfReportName, DataSet dataForReport) { string

我在本地机器上开发了一个Crystal报表,我可以使用.ExportToHttpResponse在本地网站上呈现该报表,但一旦我将代码移动到生产服务器,就会出现“数据库登录失败”错误。我基本上使用.XML数据集文件作为本地开发报告的源。这是我的密码:

我调用一个方法来呈现报告:

private void RenderCrystalReports(string rptName, string pdfReportName, DataSet dataForReport)
  {
    string reportPath = Server.MapPath(@"\App_Data\Reports\" + rptName);
    ReportDocument report = new ReportDocument();
    report.Load(reportPath, OpenReportMethod.OpenReportByTempCopy);
    SetDBLogonForReport(ref report);
    report.SetDataSource(dataForReport);
    SetDBLogonForReport(ref report);
    report.ExportToHttpResponse(ExportFormatType.PortableDocFormat, System.Web.HttpContext.Current.Response, true, pdfReportName);
  }
要获取数据集,我有:

private DataSet GetReportData(DateTime from, DateTime to, int userID, bool totalsOnly)
  {
    DataTable Job = _reportRepository.GetAccountHistoryJob(from, to, userID, totalsOnly);
    Job.TableName = "Accounts";
    DataSet ds = new DataSet("AccountsDS");
    ds.Tables.AddRange(new DataTable[] { Job });
    return ds;
  }
就我而言,下面的方法应该可以帮助我连接到远程SQL server:

private void SetDBLogonForReport(ref ReportDocument reportDocument)
  {
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString());
    ConnectionInfo connectionInfo = new ConnectionInfo();
    connectionInfo.DatabaseName = builder.InitialCatalog;
    connectionInfo.UserID = builder.UserID;
    connectionInfo.Password = builder.Password;
    connectionInfo.ServerName = builder.DataSource;

    Tables tables = reportDocument.Database.Tables;
    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
    {
      TableLogOnInfo tableLogonInfo = table.LogOnInfo;
      tableLogonInfo.ConnectionInfo = connectionInfo;
      table.ApplyLogOnInfo(tableLogonInfo);
    }
  }

为什么这不起作用?我刚刚发现,即使在本地也使用.xml数据集,那么如何使用我获得的sql数据集呢?

这是适用于我的代码:

public ActionResult TestReport() {
  RenderCrystalReports("demoRPT.rpt", "Some Report", GetReportDs());
  return View();
}


#region Private methods
private void RenderCrystalReports(string rptName, string pdfReportName, DataSet dataForReport)
{
  string reportPath = Server.MapPath(@"\Reports\" + rptName);
  ReportDocument report = new ReportDocument();
  report.Load(reportPath, OpenReportMethod.OpenReportByTempCopy);

  DataTable jobTable = GetReportTable();
  report.Database.Tables[0].SetDataSource(jobTable);

  report.ExportToHttpResponse(ExportFormatType.PortableDocFormat, System.Web.HttpContext.Current.Response, true, pdfReportName);

}

private DataTable GetReportTable()
{
  DataTable Job = GetReportData();
  Job.TableName = "Accounts";
  return Job;
}

private DataSet GetReportDs()
{
  DataTable Job = GetReportData();
  Job.TableName = "Accounts";
  DataSet ds = new DataSet("AccountsDS");
  ds.Tables.AddRange(new DataTable[] { Job });
  return ds;
}

private DataTable GetReportData()
{
  DataTable table = new DataTable();
  table.Columns.Add("Date", typeof(DateTime));
  table.Rows.Add(DateTime.Now);
  return table;
}
#endregion

我相信这个问题已经在crystal reports支持论坛上被多次询问和解决。话虽如此,我自己也有这个问题,为了解决这个问题,我几乎做了所有的事情,从使用权限到重新安装crystal reports?你做了什么来调试它?我查看了SQL profiler,可以看到web服务器正在调用存储过程。我做了太多的事情,没有真正指出确切的问题。我担心,可能是服务器上的crystal reports版本不是最新的,用户权限不正确,使用.net 4.0,但没有添加“”我在这两台机器上安装了相同的“SAP Crystal report runtime engine for.Net Framework 4(64位)”。Crystal是否使用标准端口进行通信(1433)??哦,我的web.config中没有useLegacyV2RuntimeActivationPolicy。我可以访问另一个网站的代码,他们运行的是Framework4和同一个Crystal,但它不在他们的配置中?这取决于sap是否在更高版本中修复了该问题,我们使用的是13.200版以及.net 4.0版,这迫使我们使用useLegacyV2RuntimeActivationPolicy。关于它使用哪个端口,我不知道。CrystalReports非常流行,有时需要指定为x64而不是“任何CPU”编译,有时则不需要。这是一个巨大的谜团,可以通过摆弄几乎所有的东西而不做任何事情来解决,从而使它在多个环境中工作。我已经在几台计算机上为web和winforms做了这项工作,要找出原因是什么让我很痛苦。