报告在将 DataTable 设置为 DataSource 时要求数据库登录 [英] Report asking for database login on setting DataTable as DataSource

查看:19
本文介绍了报告在将 DataTable 设置为 DataSource 时要求数据库登录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

报表设计器在设计器中创建水晶报表,并通过 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].LocationReportDocument.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. 您正在连接到用于设计报告的相同的服务器和数据库名称.
  2. 您正在连接到一个不同的数据库或服务器.

场景 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 时要求数据库登录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆