当带有报表查看器的表单加载时,通过 C# 代码动态更改 Crystal Report 的数据库路径

Posted

技术标签:

【中文标题】当带有报表查看器的表单加载时,通过 C# 代码动态更改 Crystal Report 的数据库路径【英文标题】:Change the database path for a Crystal Report dynamically through C# code when the form with the report viewer loads 【发布时间】:2011-12-18 14:35:02 【问题描述】:

我有一个连接到 Access 数据库 (.mdb) 的简单应用程序。我只使用代码将数据库文件连接到应用程序。连接字符串如下,

“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\CentreDB.mdb;Jet OLEDB:Database Password=pass”

出于设计目的,我使用报表向导中的连接数据库文件选项将数据库文件连接到水晶报表。但是我需要使用代码将数据库动态分配给水晶报表,这样我在客户端机器上部署时就不会出现问题。我尝试在下面使用此代码。

public void ViewReport(FileInfo crFileInfo) // path\filename.rpt
        
            ConnectionInfo crConnectionInfo = new ConnectionInfo();
            crConnectionInfo.ServerName = "YOUR SERVER NAME";
            crConnectionInfo.DatabaseName = "YOUR DATABASE NAME";
            crConnectionInfo.UserID = "YOUR DATABASE USERNAME";
            crConnectionInfo.Password = "YOUR DATABASE PASSWORD";

            // CrystalReportViewer control
            crViewer.ReportSource = ReportSourceSetup(crFileInfo, crConnectionInfo);
            crViewer.Refresh();
        

        ReportDocument ReportSourceSetup(FileInfo crFileInfo, ConnectionInfo crConnectionInfo)
        
            ReportDocument crDoc = new ReportDocument();
            TableLogOnInfos crTableLogonInfos = new TableLogOnInfos();
            TableLogOnInfo crTableLogonInfo = new TableLogOnInfo();
            Tables crTables;

            crDoc.Load(crFileInfo.FullName);

            // Each table in report needs to have logoninfo setup:
            crTables = crDoc.Database.Tables;
            foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in crTables)
            
                crTableLogonInfo = crTable.LogOnInfo;
                crTableLogonInfo.ConnectionInfo = crConnectionInfo;
                crTable.ApplyLogOnInfo(crTableLogonInfo);
            

            return crDoc;
         

我在网上找到了这个示例,但我无法让它工作。我需要知道我需要准确地将它放在哪里以及我应该为“您的服务器名称”、“您的数据库名称”传递什么,因为我使用的数据库文件只有一个密码。我认为 FileInfo 对象带有数据库的路径。如果可能,请帮助我。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

对于访问,我认为您应该指定一个 DSN 作为服务器名称,因此在机器上设置一个 DSN 并以这种方式引用它...如果您将 dsn 命名为 access_dsn:

        ConnectionInfo crConnectionInfo = new ConnectionInfo();
        crConnectionInfo.ServerName = "access_dsn"; //dsn name
        crConnectionInfo.DatabaseName = ""; //leave blank, it knows from DSN
        crConnectionInfo.UserID = "YOUR DATABASE USERNAME";
        crConnectionInfo.Password = "YOUR DATABASE PASSWORD";

【讨论】:

我明白你在说什么,但是我仍然必须去客户端机器并根据我部署应用程序的位置为访问数据库手动创建一个 DSN。是不是没有别的办法了。请原谅我的无能,我是编程新手。 一个 DSN 只是几个注册表项。如果您要为访问数据库创建安装程序应用程序,那么在安装程序中包含这些注册表项并让它在安装时为您设置 DSN 应该是相当简单的。我在使用 Inno Setup 编译器之前已经完成了这项工作,并且效果很好(我还得到了它来安装 ODBC DSN 所需的驱动程序)

以上是关于当带有报表查看器的表单加载时,通过 C# 代码动态更改 Crystal Report 的数据库路径的主要内容,如果未能解决你的问题,请参考以下文章

带有加载微调器的 jQuery 验证

制作多页报表:水晶报表查看器只生成第一页(C#)

C#中如何动态加载和卸载DLL

打开报表时从表单输入变量

如何动态添加SplitContainer c#

报告查看器控件(Web)显示空白报告