2013-09-25 58 views
0

我正在編寫一個應用程序,它將更改Crystal Reports報告文件中的數據庫訪問參數。我使用.NET窗體應用程序打開報告並應用SDK功能來更改驅動程序類型(ODBC/OLEDB),服務器名稱,數據庫名稱,用戶,密碼,身份驗證類型等。我遇到問題數據庫名稱。我的代碼會更改表ConnectionInfo的具體屬性(在子報表中),但無法更新報表中的一般SQL查詢。這導致報告仍然訪問舊數據庫。Crystal Reports中的SQL查詢不更新

因此,如果原始報告配置爲訪問database_1,並將其更改爲database_2,則它將將所有表屬性正確更改爲database_2(可在Designer中驗證)。它仍然會在查詢中擁有database_1。數據庫名稱在SDK RowsetController.GetSQLStatement()結果和Crystal Reports Developer查詢視圖(數據庫 - >顯示SQL查詢...)中保持不變。

而且我必須有兩個數據庫(database_1和了Database_2)在線而發生轉換,否則我得到任何GetSQLStatement異常(當database_1處於脫機狀態,原因是其仍然是指它)或SetTableLocation(當了Database_2處於離線狀態 - 儘管這是預期的和可接受的行爲)。如果兩個數據庫都在線,則沒有錯誤。

這正是我使用的是什麼:

1)CrystalDecisions.CrystalReports.Engine.ReportDocument.Load(文件路徑,OpenReportMethod.OpenReportByTempCopy) (...)

2)請並填充CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag

3)遍歷CrystalDecisions.ReportAppServer.DataDefModel.Tables並使用SetTableLocaiton()爲每個屬性應用所有屬性。

4)與每個子報表

5)RowsetController.GetSQLStatement()重複,以查看該報告的SQL查詢。

是否有一些方法來更新基於新表ConnectionInfos(似乎設置正確)的查詢?我甚至沒有看到任何手動更新查詢的可能性(GET,搜索&替換,SET)。

我使用:

.NET 4.5, 的Visual Studio 2012, CR爲VS 13.0.5, Crystal Reports開發9.2.2.693的結果驗證(來源報告也用它創建)

+1

當你說查詢時,你的意思是由Crystal報表創建的SQL,或者你正在使用一個命令,你的問題是如何更新命令?你可以檢查這個產品:http://www.r-tag.com/Pages/CRDataSource.aspx如果它能夠改變連接,你也應該能夠做到這一點。否則,查詢有一些特定的內容。 – Lan

+0

我的意思是由CR創建的主報告的整體SQL查詢。命令很容易更新,同時迭代所有表,應用屬性包並使用SetTableLocation。我已經找到了答案,但仍然感謝產品的鏈接! –

回答

1

答案:設置propper 限定名稱爲每個表。 QualifiedName是包含DbName的表的全名。這稍後出現在報表的SQL查詢中。通過我們瞭解的合格名稱:

myDatabase.mySchema。myTableName

代碼示例:

CrystalDecisions.ReportAppServer.DataDefModel.Table boTable = new CrystalDecisions.ReportAppServer.DataDefModel.Table(); 
CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag boMainPropertyBag = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag(); 
CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag boInnerPropertyBag = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag(); 

// Custom function to fill property bags with values which influence the table properties as seen in CR Developer 
FillPropertyBags(boMainPropertyBag, boInnerPropertyBag); 

CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo boConnectionInfo = new CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo(); 
boConnectionInfo.Attributes = boMainPropertyBag; 
boConnectionInfo.Kind = CrystalDecisions.ReportAppServer.DataDefModel.CrConnectionInfoKindEnum.crConnectionInfoKindCRQE; 

boTable.ConnectionInfo = boConnectionInfo; 

CrystalDecisions.ReportAppServer.DataDefModel.Tables boTables = boReportDocument.ReportClientDocument.DatabaseController.Database.Tables; 

for (int i = 0; i < boTables.Count; i++) 
{ 
    boTable.Name = boTables[i].Name; 
    // the QualifiedName is directly taken into the CR general query so this is a quick fix to change it 
    boTable.QualifiedName = boTables[i].QualifiedName.Replace("oldDbName", "newDbName"); 
    boTable.Alias = boTables[i].Alias; 
    boReportDocument.ReportClientDocument.DatabaseController.SetTableLocation(boTables[i], boTable); 
} 

呃...研究一整天和SO發佈問題後找到答案。