2016-01-13 28 views
1

我有我的數據庫和應用程序在運行時水晶報表(網頁,API &服務總線,所有在運行時創建的Crystal Reports)在同一臺服務器上。所有在運行時都能完美地創建報告。創建使用遠程SQL Server作爲數據源

移動的數據庫到不同的服務器,其只允許從該應用服務器的遠程連接。

對於我的數據庫連接,我不得不在我的項目做的是改變服務器從(本地)的連接字符串中的數據庫服務器的IP地址,而這一切工作正常。

但是看來,如果這是剛剛從改變(本地)服務器的IP地址的水晶報表不工作(給一個「數據庫登錄失敗」錯誤)

我不知道的問題,但對於本地創建的報告(之前上傳.RPT到服務器),我必須創建在服務器設置爲「本地」(數據源位置)的連接。由於我無法從我的本地機器遠程訪問新的數據庫,我不能改變的)

我用一下如下代碼:

string server = ConfigurationManager.AppSettings["Server"]; 
string database = ConfigurationManager.AppSettings["Database"]; 
string user = ConfigurationManager.AppSettings["DatabaseUser"]; 
string password = ConfigurationManager.AppSettings["DatabasePassword"]; 
var report = new ReportClass {FileName = reportPath}; 
report.Load(); 
report.SetDatabaseLogon(user, password, server, database); 
var parameterValue = new ParameterDiscreteValue {Value = item.Id}; 
var parameter = new ParameterValues {parameterValue}; 
report.DataDefinition.ParameterFields["@id"].ApplyCurrentValues(parameter); 
report.ExportToDisk(ExportFormatType.PortableDocFormat, path); 

回答

0

我用水晶報表上的Oracle數據庫,在我的應用程序使用驗證碼: CrystalDecisions.CrystalReports.Engine.ReportDocument rpt = new CrystalDecisions.CrystalReports.Engine.ReportDocument(); //reset connection DBController.LogonEx(DBAlias, "", DBUsername, DBPassword); //Create the QE (query engine) propertybag with the provider details and logon property bag CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag QE_Details = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag(); ConnectionInfo ci = DBController.GetConnectionInfos(null)[0]; //copy from existing attributes except for server name for (int idx = 0; idx < ci.Attributes.PropertyIDs.Count; idx++) { switch (ci.Attributes.PropertyIDs[idx]) { case "QE_ServerDescription": QE_Details.Add(ci.Attributes.PropertyIDs[idx], DBAlias); break; case "QE_LogonProperties": //this is itself a property bag CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag logonDetails = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag(); PropertyBag OLDLogon = (PropertyBag)ci.Attributes[ci.Attributes.PropertyIDs[idx]]; for (int idx2 = 0; idx2 < OLDLogon.PropertyIDs.Count; idx2++) { switch (OLDLogon.PropertyIDs[idx2]) { case "Server": case "Data Source": logonDetails.Add(OLDLogon.PropertyIDs[idx2], DBAlias); break; default: logonDetails.Add(OLDLogon.PropertyIDs[idx2], OLDLogon[OLDLogon.PropertyIDs[idx2]]); break; } } QE_Details.Add(ci.Attributes.PropertyIDs[idx], logonDetails); break; default: QE_Details.Add(ci.Attributes.PropertyIDs[idx], ci.Attributes[ci.Attributes.PropertyIDs[idx]]); break; } } //now replace all existing connections with new one CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo newConnInfo = new CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo(); newConnInfo.Attributes = QE_Details; newConnInfo.Kind = CrystalDecisions.ReportAppServer.DataDefModel.CrConnectionInfoKindEnum.crConnectionInfoKindCRQE; newConnInfo.UserName = DBUsername; newConnInfo.Password = DBPassword; foreach (CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo oldConnInfo in DBController.GetConnectionInfos(null)) { DBController.ReplaceConnection(oldConnInfo, newConnInfo.Clone(true), null, CrystalDecisions.ReportAppServer.DataDefModel.CrDBOptionsEnum.crDBOptionDoNotVerifyDB); }

我希望這會幫助

0

謝謝你,我結束了這一點,工作(使用SQL) 本質的想法是設定的登錄信息不只是報告,但也適用於所有子報表。如果能夠做一個「報告中的foreach子報告..」,本來會很好,但似乎不是這樣工作的

 public static void SetConnections(ReportDocument report) 
    { 
     Database database = report.Database; 

     Tables tables = database.Tables; 

     var crConnInfo = new ConnectionInfo 
     { 
      ServerName = ConfigurationManager.AppSettings["Server"], 
      DatabaseName = ConfigurationManager.AppSettings["Database"], 
      UserID = ConfigurationManager.AppSettings["DatabaseUser"], 
      Password = ConfigurationManager.AppSettings["DatabasePassword"] 
     }; 

     foreach (Table table in tables) 
     { 
      TableLogOnInfo crLogOnInfo = table.LogOnInfo; 
      crLogOnInfo.ConnectionInfo = crConnInfo; 
      table.ApplyLogOnInfo(crLogOnInfo); 
     } 

     Sections crSections = report.ReportDefinition.Sections; 
     foreach (Section crSection in crSections) 
     { 
      ReportObjects crReportObjects = crSection.ReportObjects; 
      foreach (ReportObject crReportObject in crReportObjects) 
      { 
       if (crReportObject.Kind == ReportObjectKind.SubreportObject) 
       { 
        var crSubreportObject = (SubreportObject)crReportObject; 

        ReportDocument subRepDoc = crSubreportObject.OpenSubreport(crSubreportObject.SubreportName); 

        Database crDatabase = subRepDoc.Database; 
        Tables crTables = crDatabase.Tables; 

        foreach (Table crTable in crTables) 
        { 
         TableLogOnInfo crLogOnInfo = crTable.LogOnInfo; 
         crLogOnInfo.ConnectionInfo = crConnInfo; 
         crTable.ApplyLogOnInfo(crLogOnInfo); 
        } 
       } 
      } 
     } 
    } 
相關問題