2010-03-25 39 views
2

我正在运行CR XI,并通过ASP.NET页面中的ReportViewer访问.RPT文件。Crystal Reports Reportviewer - 设置数据源动态不工作:argh:

我已经得到了下面的代码,它应该动态设置报表数据源。

  rptSP = New ReportDocument 
      Dim rptPath As String = Request.QueryString("report") 
      rptSP.Load(rptPath.ToString, 0) 
      Dim SConn As New System.Data.SqlClient.SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings("MyConnectionString").ConnectionString) 
      rptSP.DataSourceConnections(SConn.DataSource, SConn.InitialCatalog).SetConnection(SConn.DataSource, SConn.InitialCatalog, SConn.UserID, SConn.Password) 
      Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo 
      myConnectionInfo.ServerName = SConn.DataSource 
      myConnectionInfo.DatabaseName = SConn.InitialCatalog 
      myConnectionInfo.UserID = SConn.UserID 
      myConnectionInfo.Password = SConn.Password 
  'Two new methods to loop through all objects and tables contained in the requested report and set 
      'login credentials for each object and table. 
      SetDBLogonForReport(myConnectionInfo, rptSP) 
      SetDBLogonForSubreports(myConnectionInfo, rptSP) 


      Me.CrystalReportViewer1.ReportSource = rptSP 

但是当我去到每一个.RPT文件,并打开数据库专家部分,但显然仍servernames节点在那里硬编码,和上面列出的代码似乎并不能够更改硬编码的服务器名称。

我这样说是因为我有培训和生产环境。当.RPT文件使用我的生产服务器进行硬编码时,我使用上面的代码在训练服务器上打开它(并且web.config在连接字符串中具有训练服务器)时,我会得到以下代码:

未将对象引用设置为对象的实例。

然后,如果我进入.RPT文件,并将数据源更改为训练服务器,并尝试再次打开它,它会正常工作。为什么上面的代码不覆盖.RPT文件数据源?

如何避免在将报表从服务器迁移到服务器时必须打开每个.RPT并更改数据源? .RPT文件中是否存在我缺少或设置的设置?

回答

2

你打电话给水晶方法ApplyLogOnInfo?这是我使用的代码片段,工作正常。

 //Set database details 
     TableLogOnInfo oLogOn; 
     foreach (CrystalDecisions.CrystalReports.Engine.Table tbCurrent in report.Database.Tables) 
     { 
      oLogOn = tbCurrent.LogOnInfo; 
      oLogOn.ConnectionInfo.DatabaseName = databaseName; 
      oLogOn.ConnectionInfo.UserID = userName; 
      oLogOn.ConnectionInfo.Password = pwd; 
      oLogOn.ConnectionInfo.ServerName = serverName; 
      oLogOn.ConnectionInfo.Type = ConnectionInfoType.SQL; 
      tbCurrent.ApplyLogOnInfo(oLogOn); 
     } 

你将不得不改变reportrptSP

感谢

0

我知道这可能听起来很奇怪,但我遇到过使用报告参数的问题。在设置值之前,我必须设置参数对象。

这可能意味着您可能需要在配置它之前将您的报表对象设置为源。你有没有尝试过?

+0

我不确定你的建议。你也许有一些代码? – Albert 2010-03-31 20:04:27

0

我有一个C#代码完全相同的问题。 我有一个DEV和PROD环境,并且数据源被硬编码到DEV。 有趣的部分是我有5个报告,使用完全相同的代码和3不工作。 我想也许验证数据库和更新数据库会做的伎俩,因为它是保持数据库不同步,所以它不会更新数据源,但我已经这样做,仍然我的三个报告不起作用。 不确定它是否是现在的代码,因为我的5个报告使用了精确的代码。

  addParametersToFields("inst", inst, fields); 
      addParametersToFields("reportSubTitle", reportSubTitle, fields); 

      CrystalReportViewer1.ParameterFieldInfo = fields; 
      rptDoc.Load(Server.MapPath(report)); 

      ConnectionInfo connectionInfo = Reports.GetConnectionInfo(server, database, "userID", "password"); 
      connectionInfo.IntegratedSecurity = true; 

      connectionInfo.Type = ConnectionInfoType.SQL; 
      SetDBLogonForReport(connectionInfo, env); 
      CrystalReportViewer1.ReportSource = rptDoc; 
     } 
     catch (Exception e) 
     { 
     } 
     finally 
     { 
     } 

    } 

    private void SetDBLogonForReport(ConnectionInfo oConnectionInfo, string env) 
    { 
     try 
     { 
      TableLogOnInfos oTableLogOnInfos = CrystalReportViewer1.LogOnInfo; 
      string[] sparams = new string[]{ 
      }; 

      foreach (CrystalDecisions.CrystalReports.Engine.Table oTable in rptDoc.Database.Tables) 
      { 
       if (oTable.LogOnInfo.ConnectionInfo.ServerName == oConnectionInfo.ServerName) 
       { 
        TableLogOnInfo oTableLogOnInfo = oTable.LogOnInfo; 

        oTableLogOnInfo.ConnectionInfo = oConnectionInfo; 

        oTable.ApplyLogOnInfo(oTableLogOnInfo); 


        bool b = oTable.TestConnectivity(); 

        if (!b) 
        { 
         invokeErrorLogger(sparams, env); 
        } 
       } 
      } 

     } 
     catch 
     { 
      throw; 
     } 
    }