将DataSet和ODBC数据源连接到单个Crystal Report(C#)

2020-09-07 08:48发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)我有一个Web应用程序(带有We...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有一个Web应用程序(带有Webform的.NET MVC,用于显示Crystal Report Viewer)。 我在Visual Studio中创建了一个数据集。 我正在尝试将此数据集连接到具有来自ODBC数据库的字段的现有Crystal Report。 如何配置报告以连接到两个数据源? 我能够将每个报表连接到不同的报表,但不能连接在一起。 谢谢!

//连接到数据集
 受保护的void Page_Load(对象发送者,EventArgs e)
         {
             ReportDocument报告=新的ReportDocument();
             字符串reportPath2 = Server.MapPath(" CrystalReport2.rpt");

             DataSet ds = new DataSet(" Customers");
             DataTable表=新的DataTable("客户");
             table.Columns.Add(" Name",typeof(System.String));
             table.Columns.Add(" Age",typeof(System.Int32));
             DataRow row1 = table.NewRow();
             row1 [" Name"] =" John Doe";
             row1 [" Age"] = 45;

             table.Rows.Add(row1);
             ds.Tables.Add(table);

             report.Load(reportPath2);
             report.SetDataSource(ds);
             CrystalReportViewer1.ReportSource =报告;
         }
//****************************************************  **************************************
//连接到ODBC
 受保护的void Page_Init(对象发送者,EventArgs e)
         {
             字符串reportPath = Server.MapPath(" CrystalReport2.rpt");

            //首次加载报告
             if(!IsPostBack ||(ReportDocument)Session [" Report"] == null)
             {
                 report = new ReportDocument();
                 report.Load(" reportPath");
                 ConfigureCrystalReport(report);
                 Session.Add(" Report",report);
             }
          //连接Crystal Report Viewer以在会话中显示已加载的报告
           CrystalReportViewer1.ReportSource =(ReportDocument)Session [" Report"];

          //防止在报表打开时提示参数
           CrystalReportViewer1.EnableParameterPrompt = false;
         }

   公共无效ConfigureCrystalReport(ReportDocument报告)
         {
             ConnectionInfo connectionInfo =新的ConnectionInfo();
             AssignConnection(connectionInfo);

            //将连接分配给主报表中的所有表
             foreach(report.Database.Tables中的CrystalDecisions.CrystalReports.Engine.Table表)
             {
                 AssignTableConnection(table,connectionInfo);
             }

            //循环遍历所有节及其对象,以对子报表执行相同的操作
             foreach(report.ReportDefinition.Sections中的" CrystalDecisions.CrystalReports.Engine.Section"部分)
             {
                //在每个部分中,我们需要遍历所有报告对象
                 foreach(CrystalDecisions.CrystalReports.Engine.ReportObject reportObject在section.ReportObjects中)
                 {
                     如果(reportObject.Kind == ReportObjectKind.SubreportObject)
                     {
                         SubreportObject subReport =(SubreportObject)reportObject;
                         ReportDocument subDocument = subReport.OpenSubreport(subReport.SubreportName);

                         foreach(subDocument.Database.Tables中的CrystalDecisions.CrystalReports.Engine.Table表)
                         {
                             AssignTableConnection(table,connectionInfo);
                         }
                     }
                 }
             }
         }


         公共静态void AssignConnection(ConnectionInfo连接)
         {
            //自动登录数据库而不会提示用户
             connection.UserID =" USER_ID";
             connection.Password =" _PASSWORD";
             connection.ServerName =" SERVER_NAME";
         }

         公共静态无效AssignTableConnection(CrystalDecisions.CrystalReports.Engine.Table表,ConnectionInfo连接)
         {
            //缓存登录信息块
             TableLogOnInfo logOnInfo = table.LogOnInfo;


            //设置连接
             logOnInfo.ConnectionInfo =连接;


            //将连接应用于表!
             table.ApplyLogOnInfo(logOnInfo);
         }