在 C# 中运行时更改 Crystal Report 数据源(访问)

Posted

技术标签:

【中文标题】在 C# 中运行时更改 Crystal Report 数据源(访问)【英文标题】:Changing a Crystal Report datasource (access) at runtime in C# 【发布时间】:2015-04-13 09:35:38 【问题描述】:

尝试在运行时更改我的数据源时出现错误“登录失败”。我已经搜索了 SO 和 SAP 站点,并将下面的代码放在一起,但我仍然收到错误消息。我的访问数据库是 2013 年,没有密码保护,我使用的是默认的“管理员”用户。该报表有一个 OLE DB 连接。我的代码循环遍历所有表,包括子报表并更改登录名,我还更改了数据库登录名。非常感谢任何帮助:

public void RunTestReport()
    
        DataSet testDataSet = new DL.NonConformance().GetNonConformances(1, "NonConformance");

        var rpt = new ReportDocument();
        rpt.Load(@"C:\Reports\rptTest.rpt");

        SetCrystalLogin(rpt);

        rpt.SetDataSource(testDataSet);

        crystalReportViewer1.ReportSource = rpt;
        crystalReportViewer1.Refresh();
    

    public void SetCrystalLogin(ReportDocument oRpt)
    
        ConnectionInfo oConnectInfo = new ConnectionInfo();

        string dbpath = string.Concat(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"\db\dbacc.db");

        oConnectInfo.ServerName = dbpath;
        oConnectInfo.DatabaseName = string.Empty;
        oConnectInfo.UserID = "Admin";
        oConnectInfo.Password = string.Empty;

        // Set the logon credentials for all tables
        SetCrystalTablesLogin(oConnectInfo, oRpt.Database.Tables);

        // Check for subreports
        foreach (CrystalDecisions.CrystalReports.Engine.Section oSection in oRpt.ReportDefinition.Sections)
        
            foreach (CrystalDecisions.CrystalReports.Engine.ReportObject oRptObj in oSection.ReportObjects)
            
                if (oRptObj.Kind == CrystalDecisions.Shared.ReportObjectKind.SubreportObject)
                
                    // This is a subreport so set the logon credentials for this report's tables
                    CrystalDecisions.CrystalReports.Engine.SubreportObject oSubRptObj = oRptObj as CrystalDecisions.CrystalReports.Engine.SubreportObject;

                    // Open the subreport
                    CrystalDecisions.CrystalReports.Engine.ReportDocument oSubRpt = oSubRptObj.OpenSubreport(oSubRptObj.SubreportName);

                    SetCrystalTablesLogin(oConnectInfo, oSubRpt.Database.Tables);
                
            
        

        oRpt.Refresh();

        oRpt.SetDatabaseLogon("Admin", string.Empty, dbpath, string.Empty, true);

        oRpt.VerifyDatabase();

        oRpt.Refresh();
    

    private void SetCrystalTablesLogin(CrystalDecisions.Shared.ConnectionInfo oConnectInfo, Tables oTables)
    
        foreach (CrystalDecisions.CrystalReports.Engine.Table oTable in oTables)
        
            CrystalDecisions.Shared.TableLogOnInfo oLogonInfo = oTable.LogOnInfo;
            oLogonInfo.ConnectionInfo = oConnectInfo;

            oTable.ApplyLogOnInfo(oLogonInfo);
        
    

【问题讨论】:

【参考方案1】:

原来你不能在运行时配置 .accdb 数据源,我需要创建一个 ODBC 连接。

【讨论】:

以上是关于在 C# 中运行时更改 Crystal Report 数据源(访问)的主要内容,如果未能解决你的问题,请参考以下文章

简单的 C# 应用程序无法正常工作,在 Visual Studio 中运行时工作正常

在 MFC 中运行时更改编辑框属性

如何使用ng-model更改表中运行时的记录

在 WPF .net core 5 中运行时更改应用程序文化时如何更新属性绑定

在visual studio 2008中运行时,表单不显示更改

iOS9:UIViewController:当 viewController 在第二个 UIWindow 中运行时,不会在拆分视图更改时调用 viewWillTransitionToSize