2012-05-25 23 views
0

這裏我使用下面的代碼在加載Crystal Report時輸入單個數據庫的登錄詳細信息。如何使用C#在Crystal Report中輸入多個數據庫的登錄信息?

rpt.Load(reportPath); 
ConnectionInfo connectionInfo = new ConnectionInfo(); 
connectionInfo.DatabaseName = "Northwind"; 
connectionInfo.UserID = "user"; 
connectionInfo.Password="user123"; 
SetDBLogonForReport(connectionInfo,rpt); 
CrystalReportViewer1.ReportSource = rpt; 

private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument reportDocument) 
{ 
    Tables tables = reportDocument.Database.Tables; 
    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables) 
    { 
     TableLogOnInfo tableLogonInfo = table.LogOnInfo; 
     tableLogonInfo.ConnectionInfo = connectionInfo; 
     table.ApplyLogOnInfo(tableLogonInfo); 
    } 
} 

但我怎麼能進入2數據庫的名稱,並在此代碼加載水晶報表的登錄詳細信息...

+0

爲什麼你要輸入2個Db的名稱和登錄詳細信息..你想創建一個從2個Db中同時提取數據的報告..? – ria

+0

Thx for your reply,是的,我創建了一個報告,從2個不同的數據庫中提取數據,同時在查看器中打開它以請求登錄詳細信息。所以我想用C#代碼登錄。我該怎麼做? –

+0

您用哪種方式從數據庫中提取數據存儲過程..? – Asif

回答

0

SetDBLogonForReport檢查If (reportDocument.Database.Tables.Item(i).Name == "TableName")

然後應用

tableLogonInfo.ConnectionInfo.ServerName = "AltetrnativeName" 
tableLogonInfo.ConnectionInfo.DatabaseName= "AltetrnativeDBName" 
tableLogonInfo.ConnectionInfo.ReportUser= "AltetrnativeUser" 
tableLogonInfo.ConnectionInfo.Password= "AltetrnativePsw" 

如果不是,則使用您傳遞的connectionInfo。這是爲了解釋目的,您還可以傳遞AlternativeConnectionInfo作爲參數。

通過這種方式,您可以通過表格將任意數量的BD連接到報表。

如果不清楚請告訴我。我會很樂意以更詳細的方式解釋。

+0

Thx爲您的答覆!我需要添加所有這些tablelogonInfo? ,因爲我已經將connectionInfo添加到SetDBLogonForReport中並在SetDBLogonForReport中調用它們。你能給我提供完整的代碼結構,它會更有幫助! –

0

從你的文章中,我加入了一些示例代碼

rpt.Load(reportPath); 
ConnectionInfo connectionInfo = new ConnectionInfo(); 
connectionInfo.DatabaseName = "Northwind"; 
connectionInfo.UserID = "user"; 
connectionInfo.Password="user123"; 

ConnectionInfo altConnectionInfo = new ConnectionInfo(); 
altConnectionInfo.DatabaseName = "altDataBase"; 
altConnectionInfo.UserID = "atlUser"; 
altConnectionInfo.Password="123user123"; 

SetDBLogonForReport(connectionInfo, altConnectionInfo, rpt); 
CrystalReportViewer1.ReportSource = rpt; 

private void SetDBLogonForReport(ConnectionInfo connectionInfo, ConnectionInfo altConnectionInfo ReportDocument reportDocument) 
{ 
    Tables tables = reportDocument.Database.Tables; 
    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables) 
    { 
     TableLogOnInfo tableLogonInfo = table.LogOnInfo; 
     //you can add as much tables as you want but associated with the same connectionInfo 
     if (table.Name == "SomeTable") { tableLogonInfo.ConnectionInfo = altConnectionInfo; } 
     //if you have multiple connections, you could even use switch structure depending on the table name. 
     else { tableLogonInfo.ConnectionInfo = connectionInfo; } 
     //unfortunately, this uses table name property, so you must specify any table name depending on the connection you want to associate with. 

     table.ApplyLogOnInfo(tableLogonInfo); 
    } 
} 

要使用水晶報表,該SetDBLogonForReport允許您將connectionInfo添加到每個表。這是CR工作的方式。我無法找到另一種方式來做到這一點(我不喜歡使用硬編碼表名)

希望這有助於!

+0

Thx再次!現在我明白了這一點,但我希望在altConnectionInfo中我們需要使用altconnectionInfo.DatabaseName =「altDataBase」; not connectionInfo.DatabaseName =「altDataBase」;即使我不能加載報告。它說我的一張桌子沒有找到... :( –

+0

對不起,我編輯了這篇文章以糾正它。你是否嘗試重新設置數據源位置,然後驗證數據庫?報告預覽是否在開發工作? – Minus

+0

在開發中它工作正常。但是,當我在windows appl中運行該報告時,它表示沒有找到表,但我也重置了數據源位置,但仍然得到相同的錯誤,這意味着它只接受「ConnectionInfo」而不接受「altConnectionInfo」 ,如果我在連接信息之間切換數據庫名稱,則始終採用「ConnectionInfo」 –

相關問題