【问题标题】:Crystal Reports Reportviewer - Set Datasource Dynamically Not Working :argh:Crystal Reports Reportviewer - 动态设置数据源不工作 :argh:
【发布时间】:2010-03-25 17:27:43
【问题描述】:

我正在运行 CR XI,并通过我的 ASP.NET 页面中的 ReportViewer 访问 .RPT 文件。

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

            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 文件并打开 Database Expert 部分时,显然那里仍然存在硬编码的服务器名称,并且上面列出的代码似乎无法更改那里硬编码的服务器名称.

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

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

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

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

【问题讨论】:

    标签: .net asp.net vb.net crystal-reports reportviewer


    【解决方案1】:

    你是在调用Crystal方法ApplyLogOnInfo吗?这是我使用的代码 sn-p,效果很好。

            //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);
            }
    

    您必须将 report 更改为 rptSP

    谢谢

    【讨论】:

      【解决方案2】:

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

      这可能意味着您可能需要在配置报表对象之前将其设置为源。你试过吗?

      【讨论】:

      • 我不确定您的建议。你有一些代码吗?
      【解决方案3】:

      我对 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;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多