2017-04-03 56 views
0

我使用Visual Studio中的數據庫專家的SQL命令創建報告(Crystal Reports 11)。所以,負責從數據庫中檢索信息的查詢就在rpt文件中。如何使用數據庫專家的SQL命令以編程方式在報表中更改Crystal Reports數據源位置?

我想在我的web應用程序(C#)中以PDF文檔的形式打開它。它適用於我的應用程序的數據庫連接字符串與報表設計器中使用的字符串相同的情況。當不同的數據庫在Web.config中配置,我得到以下錯誤:用來導出報表的HttpResponse爲PDF文檔

[COMException (0x80004005): The system cannot find the file specified.] 

CrystalDecisions.ReportAppServer.Controllers.ReportSourceClass.Export(ExportOptions pExportOptions, RequestContext pRequestContext) +0 
CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext) +1994 
CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext) +802 
CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportOptions options) +231 
CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToHttpResponse(ExportOptions options, HttpResponse response, Boolean asAttachment, String attachmentName) +403 
CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToHttpResponse(ExportFormatType formatType, HttpResponse response, Boolean asAttachment, String attachmentName) +307 
RelProducaoCDS.PreencherDados(Int64 codUsuario, Int64 codUnidade, DateTime datInicio, DateTime datFim) in d:\Projetos-NET\Projetos Net\Governa.Saude.AtencaoBasica\Governa.Saude.AtencaoBasica.Web\Relatorios\Producao\RelProducaoCDS.aspx.cs:110 
RelProducaoCDS.Page_Load(Object sender, EventArgs e) in d:\Projetos-NET\Projetos Net\Governa.Saude.AtencaoBasica\Governa.Saude.AtencaoBasica.Web\Relatorios\Producao\RelProducaoCDS.aspx.cs:59 
System.Web.UI.Control.LoadRecursive() +71 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3178  

代碼。連接字符串通過ConfigurationManager類從Web.config中檢索。

 Hashtable parameters = new Hashtable(); 
     parameters.Add("COD_USER", codUsuario); 
     parameters.Add("DAT_START", datInicio); 
     parameters.Add("DAT_END", datFim); 

     ExportPDFToHttpResponse("myDatabaseConnection", "~\\Reports\\Production\\RelProductionCDS.rpt", parameters, new Hashtable()); 
    } 

    public void ExportPDFToHttpResponse(string connectionName, string rptPath, Hashtable parameters, Hashtable parametersFormula) 
    { 
     ReportDocument rpt = CreateReportDocument(connectionName, rptPath); 
     foreach (string key in parameters.Keys) 
     { 
      rpt.SetParameterValue(key, parameters[key]); 
     } 
     foreach (string key in parametersFormula.Keys) 
     { 
      rpt.DataDefinition.FormulaFields[key].Text = string.Concat("\"", parametersFormula[key] ,"\""); 
     } 
     string reportName = rptPath.Substring(0, rptPath.LastIndexOf('.')); 
     reportName = reportName.Substring(reportName.LastIndexOf('\\')); 
     rpt.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, false, reportName); 
     rpt.Close(); 
     rpt.Dispose(); 
    } 

    private ReportDocument CreateReportDocument(string connectionString, string rptPath) 
    { 
     ReportDocument rpt = new ReportDocument(); 
     rpt.Load(Server.MapPath(rptPath)); 
     ConnectionInfo connInfo = new ConnectionInfo(); 

     string connString = ConfigurationManager.ConnectionStrings[connectionString].ConnectionString; 
     SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connString); 
     connInfo.ServerName = builder.DataSource; 
     connInfo.DatabaseName = builder.InitialCatalog; 
     connInfo.IntegratedSecurity = builder.IntegratedSecurity; 
     if (!builder.IntegratedSecurity) 
     { 
      connInfo.Password = builder.Password; 
      connInfo.UserID = builder.UserID; 
     } 

     Tables tables = rpt.Database.Tables; 
     foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables) 
     { 
      TableLogOnInfo tableLogOnInfo = table.LogOnInfo; 
      tableLogOnInfo.ConnectionInfo = connInfo; 
      table.ApplyLogOnInfo(tableLogOnInfo); 
     } 
     return rpt; 
    } 
} 

回答

0

一旦您創建了水晶報表並運行它,SQL查詢將在報表內硬編碼。您可以通過「數據庫」菜單中的「顯示SQL查詢」進行檢查。

之後,您只能通過C#代碼更改服務器名稱。您的數據庫名稱&表必須相同,否則您將收到錯誤。所以我建議你創建2個或更多的報告,如果你有不同的數據庫。

但是,您可以使用以下方法將現有報表數據庫指向新的報表數據庫。 Point Crystal Reports at a new database

希望這會有所幫助。

+0

在我的方案中,我有兩個具有相同結構DB1和DB2的數據庫。我使用指向DB1的SQL命令創建了報告。當我將Web應用程序的配置更改爲指向DB2時,會引發錯誤。所以,我認爲數據庫,端口和SQL查詢在報告中是硬編碼的。 –

+0

如果是這樣,您應該可以在運行時更改數據源。我自己做到了。再次檢查你的編碼,看看下面的鏈接。 https://www.codeproject.com/Articles/270977/Change-the-data-source-of-a-Crystal-Report-at-Run – samithagun

相關問題