报表设计器在设计器中创建水晶报表,并通过 ODBC (DSN) 连接直接连接到数据库.相同的报告通过 DSN 的 Winform(C#) 应用程序执行,并提供数据库服务器、数据库、用户 ID 和密码.
Report designer creates crystal report in designer with direct connection to database with ODBC (DSN) connection. Same reports are executed via a Winform(C#) application via DSN and provides Database Server, database, user ID and password.
我需要对 Crystal Report 对象进行此类更改.ReportDocument 不应通过 DSN 直接连接到数据库.相反,我们将通过调用相应的存储过程和参数作为System.Data.DataTable
来通过服务带来数据.此 DataTable
对象应用于填充/生成报告.
I need to make such changes to the Crystal Report object. ReportDocument should not directly connect to Database via DSN. Instead, we will bring data via service by calling respective stored procedure and parameters as System.Data.DataTable
. This DataTable
object should be used to populate/generate reports.
我确实分别从 ReportDocument.DataBase.Tables[I].Location
和 ReportDocument.DataDefinition
对象获取存储过程和参数信息.使用 ReportDocument.DataBase.Tables[I].SetDataSource(DataTable)
设置 DataSource 后,它仍然要求数据库/服务器和用户凭据连接到服务器.
I do get the stored procedure and parameter information from ReportDocument.DataBase.Tables[I].Location
and ReportDocument.DataDefinition
object respectively. After setting DataSource with ReportDocument.DataBase.Tables[I].SetDataSource(DataTable)
, it still ask for database/server and user credential to connect to server.
我们能否使用内存表而不是通过 ODBC 直接连接到数据库来实现场景并填充报告?
Can we achieve scenario and populate report with in-memory table instead of direct connection to database over ODBC?
你需要关注的两件事:
场景 1:相同的服务器和数据库名称
在这种情况下,您需要使用 SetDatabaseLogon
方法提供凭据,如下所示
In this case you need to provide the credentials using SetDatabaseLogon
method as follows
'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
方法提供凭据
In this case you need to provide the credentials using ApplyLogOnInfo
method
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
到所有子报表及其表格.
Notes: If you have any sub reports, you need to apply SetDatabaseLogon
and/or ApplyLogOnInfo
to all the sub reports and their tables respectively.
更新:
将 ApplyLogOnInfo 应用于子报表
UPDATE:
Applying ApplyLogOnInfo to subreports
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);
}
}
这篇关于报告在将 DataTable 设置为 DataSource 时要求数据库登录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!