2010-03-25 67 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; 
     } 
    }