簡體   English   中英

在將DataTable設置為DataSource時要求數據庫登錄的報告

[英]Report asking for database login on setting DataTable as DataSource

報表設計器在設計器中創建水晶報表,該報表通過ODBC(DSN)連接直接連接到數據庫。 相同的報告通過DSN通過Winform(C#)應用程序執行,並提供數據庫服務器,數據庫,用戶ID和密碼。

我需要對Crystal Report對象進行此類更改。 ReportDocument不應直接通過DSN連接到數據庫。 相反,我們將通過調用各自的存儲過程和參數System.Data.DataTable來通過服務帶來數據。 DataTable對象應用於填充/生成報告。

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

我們能否實現方案並使用內存表填充報表,而不是通過ODBC直接連接到數據庫?

您需要重點注意兩件事:

  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應用於所有子報表及其表。

更新:
將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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM