兩件事情:
- 您正在連接到其被用來設計報表相同的服務器和數據庫名稱。
- 您正在連接到不同的數據庫或服務器。
方案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);
}
}
爲什麼我需要提供數據庫連接信息,當我的數據已經可以在數據表? – Nps
它的CR的安全功能,以保護數據免受未經授權的訪問。數據庫憑證(如密碼)不會保存到報告中。當您設計水晶報表表格結構時,使用當前的數據庫連接和logininfo將字段,類型和大小,關係等嵌入到報表中。當您指定自己的斷開連接的數據(DataTables)時,新的模式信息必須與現有的信息匹配。只需查看Crystal Report的SQL Query,您就可以瞭解一個想法?因此,對於數據,數據庫驗證和安全性,每次加載CR時都必須指定它。 – haraman
也斷開數據,如DataTable存儲表結構和數據。沒有數據庫,連接細節嵌入到它們中。 – haraman