2009-06-09 177 views
4

Crystal Reports 9似乎將數據庫連接信息保存在報告文件本身內。我遇到了更改該連接的問題。我與一組開發人員合作,他們在同一臺服務器上擁有自己的數據庫副本。我們使用可信連接到數據庫。當我們需要更改水晶報表時,我們點擊閃電執行報表,Crystal不會向數據庫要求登錄信息。它實際上最終會連接到最後保存報告時使用的最後一個數據庫。Crystal Reports 9數據庫連接問題

我們想出了2個解決方法:

  1. 接招晶認爲它應該連接到離線數據庫,然後結晶會要求登錄信息。
  2. 刪除正在進行水晶更改的用戶名的權限。

這些都不適合我們。有誰知道如何從報告文件中刪除晶體連接?

我們嘗試了註銷數據源位置和數據庫專家中的所有設置。

UPDATE

我還沒找到適合我的情況的解決方案。但是我們最新的解決方法是加載一份水晶報告,並且在點擊閃電(針對數據庫運行報告)之前,拔掉以太網電纜。然後,當Crystal無法找到數據庫時,請將以太網電纜重新插入,並允許您選擇不同的數據庫服務器和名稱。

+0

+1好問題,大多數人只是通過戰鬥,而不是花時間找出一個好的解決方案。 – Dusty 2009-09-01 21:47:53

回答

0

您可以在運行時設置登錄。看到這個問題...

How do I change a Crystal Report's ODBC database connection at runtime?

如果您使用ODBC,每個開發可以在相應的數據庫指向他們的DSN。實質上將連接字符串推入DSN並從晶體報告中移出。

+0

我們已經在運行時改變了連接。這不是問題。不幸的是,這個問題是設計師。 – Jon 2009-06-09 05:44:15

1

您可以在特定於用戶的位置(即每個用戶使用相同的路徑,但使用不同的物理位置)中使用.dsn數據源文件,並指定Crystal Reports。例如,在每個人的C盤上:C:\ DSNs \ db.dsn,或者映射到每個用戶的不同位置的網絡驅動器上。

你可以在MSDN上.DSN文件的詳細信息: http://msdn.microsoft.com/en-us/library/ms710900(VS.85).aspx

1

我們正在使用這種方式(使用SQL身份驗證不過):

  • 開放報告
  • 數據庫 - 登錄服務器
  • 數據庫集數據源位置
  • 刷新/預覽

您可以禁用[域用戶]訪問開發數據庫,​​將有助於太:)

+0

設置數據源位置也適用於集成身份驗證。 – 2009-09-02 15:16:07

+0

我認爲他們目前正在這樣做,因爲它看起來像所有的開發人員都有自己的副本。我認爲問題在於,他們不希望每次有不同的開發人員針對他們自己的本地數據庫處理報告時都必須這樣做。 – Dusty 2009-09-02 15:23:30

0

是的,我同意Crystal Reports是一種痛苦。我在已經構建的應用程序中遇到了同樣的問題,我不得不使用它。

1-註銷服務器(晶體內右擊數據庫和註銷) 2 - 單擊數據庫並更改數據庫的位置

如果您登錄並改變沒有關係數據庫的位置似乎不會堅持

1

我可能回答太晚沒有任何機會在賞金,但我會提供一個答案無論如何。

如果您直接運行Crystal Report或使用Crystal Enterprise運行,那麼我可以想到的唯一方法就是使用dsn作爲paulmorriss提及。這樣做的缺點是你會使用ODBC,我認爲它通常比較慢並且被認爲是過時的。

如果您在應用程序中使用它,那麼您可以簡單地更改代碼中的數據庫連接設置。然後,每個人都可以根據自己的測試數據庫開發報告,並且可以在運行時將其指向生產數據庫(假定開發人員數據庫是最新的並且包含與生產數據庫相同的字段)。

要做到這一點,你應該能夠使用的功能如下所示:

private void SetDBLogonForReport(CrystalDecisions.Shared.ConnectionInfo connectionInfo, CrystalDecisions.CrystalReports.Engine.ReportDocument reportDocument) 
{ 
    CrystalDecisions.CrystalReports.Engine.Tables tables = reportDocument.Database.Tables; 

    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables) 
    { 
     CrystalDecisions.Shared.TableLogOnInfo tableLogonInfo = table.LogOnInfo; 

     tableLogonInfo.ConnectionInfo = connectionInfo; 
     table.ApplyLogOnInfo(tableLogonInfo); 
    } 
} 

對於這個工作,你需要在ConnectionInfo對象傳遞(其中將包含所有的登錄信息)和報告文件以應用於。希望這可以幫助。

編輯 - 另一個選擇,我不敢相信我到現在還沒有想過,如果你使用SQL Server,你可以確保所有的開發數據庫名稱是相同的,那麼使用 」。」或「(本地)」作爲服務器和集成安全性,以便每個人在本地有效地擁有相同的連接信息。我認爲這可能是假設您可以讓所有開發人員使用相同設置的最佳方式。

再次編輯:) 閱讀了其他答案的一些評論後,我想我可能誤解了這個問題。沒有理由可以想到,爲什麼你無法在沒有編輯報告的權限之外執行阿沃答案中的步驟,但我假設你已經能夠做出其他更改,所以我懷疑是不是。我認爲要讓報告適用於您一直在執行這些步驟的每位開發人員。