2011-07-21 87 views
0

我有8個報表使用完全相同的代碼來設置報表數據源,其中5個報表工作並能夠指向生產環境。 3個報告的其餘部分,我運行並重新運行數據庫驗證和數據庫更新,但是當我在生產環境中運行這些報告時,它們將數據從DEV環境中帶回。由ConnectionInfo設置的Crystal報表數據源沒有被設置 - 沒有連接到正確的數據庫

這是我的數據源如何設置。 我在所有8個水晶報告中調用存儲過程。 我已經做了非常詳細的調試,並驗證了數據源數據正在獲取正確的信息,所以缺少了什麼。

  string database = ConfigurationManager.AppSettings[env + "Database"].ToString(); 
      string server = ConfigurationManager.AppSettings[env + "Server"].ToString(); 


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


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


      //connectionInfo.Attributes = attributes; 
      connectionInfo.Type = ConnectionInfoType.SQL; 
      SetDBLogonForReport(connectionInfo, env); 
      CrystalReportViewer1.ReportSource = rptDoc; 



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

        // oTable.Location = String.Format("{0}.dbo.{1}", oConnectionInfo.DatabaseName, oTable.Name); 

        bool b = oTable.TestConnectivity(); 

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

     } 
     catch 
     { 
      throw; 
     } 
    } 

回答

1

工作報告已經指向您的prod服務器。如果存儲在報告中的服務器與您嘗試設置的服務器名稱相匹配,則只應用登錄憑據。更改爲以下內容:

// Clear existing connection info first 
rptDoc.DataSourceConnections.Clear(); 

foreach (CrystalDecisions.CrystalReports.Engine.Table oTable in rptDoc.Database.Tables) 
{ 
    var oTableLogonInfo = oTable.LogonInfo; 
    oTableLogonInfo.ConnectionInfo = oConnectionInfo; 
    oTable.ApplyLogOnInfo(oTableLogonInfo); 
    bool b = oTable.TestConnectivity(); 
    if (!b) 
    { 
     invokeErrorLogger(sparams, env); 
    } 
}