报表设计器在设计器中创建水晶报表,并使用ODBC(DSN)连接直接连接到数据库。通过DSN通过Winform(C#)应用程序执行相同的报告,并提供数据库服务器,数据库,用户ID和密码。
我需要对Crystal Report对象进行此类更改。 ReportDocument不应该通过DSN直接连接到数据库。相反,我们将通过调用相应的存储过程和参数System.Data.DataTable
来通过服务提供数据。此DataTable
对象应用于填充/生成报告。
我分别从ReportDocument.DataBase.Tables[I].Location
和ReportDocument.DataDefinition
对象获取存储过程和参数信息。使用ReportDocument.DataBase.Tables[I].SetDataSource(DataTable)
设置DataSource后,它仍然要求数据库/服务器和用户凭据连接到服务器。
我们能否实现场景并使用内存表填充报表,而不是通过ODBC直接连接到数据库?
答案 0 :(得分:0)
您需要关注的两件事情:
场景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);
}
}