2015-10-20 66 views
0

報表設計器在設計器中創建水晶報表,並使用ODBC(DSN)連接直接連接到數據庫。相同的報告通過DSN通過Winform(C#)應用程序執行,並提供數據庫服務器,數據庫,用戶標識和密碼。報告要求將DataTable設置爲DataSource時要求數據庫登錄

我需要對Crystal Report對象進行這樣的更改。 ReportDocument不應通過DSN直接連接到數據庫。相反,我們將通過調用相應的存儲過程和參數來調用數據,如System.Data.DataTable。這個DataTable對象應該用來填充/生成報告。

我確實分別從ReportDocument.DataBase.Tables[I].LocationReportDocument.DataDefinition對象中獲取存儲過程和參數信息。在設置DataSource爲ReportDocument.DataBase.Tables[I].SetDataSource(DataTable)後,它仍然要求數據庫/服務器和用戶憑證連接到服務器。

我們可以實現方案並使用內存表填充報告,而不是通過ODBC直接連接到數據庫?你需要把重點放在

回答

0

兩件事情:

  1. 您正在連接到其被用來設計報表相同的服務器和數據庫名稱
  2. 您正在連接到不同的數據庫或服務器

方案1:相同的服務器和數據庫名稱

在這種情況下,你需要提供使用SetDatabaseLogon方法的憑據如下

'crDoc1 is your ReportDocument 
'dtDataTable is your DataTable 

'set database logon info 
crDoc1.SetDatabaseLogon("db_user_name", "db_password", "db_server_name_or_ip", "database_name"); 

'set DataTable as DataSource 
crDoc1.SetDataSource(dtDataTable) 

場景2:不同的服務器或數據庫名稱

在這種情況下,您需要提供憑據我們荷蘭國際集團ApplyLogOnInfo方法

ConnectionInfo crConInfo = new ConnectionInfo(); 
TableLogOnInfo crTblLogonInfo = new TableLogOnInfo(); 

crConInfo.ServerName = "db_server_name_or_ip"; 
crConInfo.DatabaseName = "database_name"; 
crConInfo.UserID = "db_user_name"; 
crConInfo.Password = "db_password"; 

'crDoc1 is your ReportDocument 
'dtDataTable is your DataTable 

'Set DataSource to your DataTable 
crDoc1.SetDataSource(dtDataTable) 

'after setting the DataSource apply Logon credentials to each table in ReportDocument 
Tables CrTables = crDoc1.Database.Tables; 
foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables) { 
    crTblLogonInfo = CrTable.LogOnInfo; 
    crTblLogonInfo.ConnectionInfo = crConInfo; 
    CrTable.ApplyLogOnInfo(crTblLogonInfo); 
} 
crDoc1.Refresh(); 
CrystalReportViewer1.ReportSource = crDoc1; 

注:如果您有任何子報表,則需要分別申請SetDatabaseLogon和/或ApplyLogOnInfo到所有的子報告及其表。

UPDATE:
應用ApplyLogOnInfo子報表

foreach (ReportDocument srSubReport in crDoc1.Subreports) { 
    foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in srSubReport.Database.Tables) { 
     crTblLogonInfo = CrTable.LogOnInfo; 
     crTblLogonInfo.ConnectionInfo = crConInfo; 
     CrTable.ApplyLogOnInfo(crTblLogonInfo); 
    } 
} 
+0

爲什麼我需要提供數據庫連接信息,當我的數據已經可以在數據表? – Nps

+0

它的CR的安全功能,以保護數據免受未經授權的訪問。數據庫憑證(如密碼)不會保存到報告中。當您設計水晶報表表格結構時,使用當前的數據庫連接和logininfo將字段,類型和大小,關係等嵌入到報表中。當您指定自己的斷開連接的數據(DataTables)時,新的模式信息必須與現有的信息匹配。只需查看Crystal Report的SQL Query,您就可以瞭解一個想法?因此,對於數據,數據庫驗證和安全性,每次加載CR時都必須指定它。 – haraman

+0

也斷開數據,如DataTable存儲表結構和數據。沒有數據庫,連接細節嵌入到它們中。 – haraman