更改 Crystal Reports 查看器连接字符串 ASP.NET

Posted

技术标签:

【中文标题】更改 Crystal Reports 查看器连接字符串 ASP.NET【英文标题】:Change Crystal Reports Viewer Connection String ASP.NET 【发布时间】:2012-06-25 21:19:39 【问题描述】:

在 Visual Studio 2010 中,我根据具有以下设置的 XML 文件动态填充 Crystal Reports 列表:

<Report file="C:\reportname.rpt"    text="Report Name"
       imageURL="~/images/reporticon.png" />

在我的 ASPX 页面中,我有一个 CrystalReportsViewer,如下所示:

<CR:CrystalReportViewer ID="CrystalReportViewer" runat="server" AutoDataBind="true"
    Width="800px" Height="600px" CssClass="reportViewer"   HasCrystalLogo="False" />

当用户点击一个报表链接(来自一个TreeNode对象)时,水晶报表查看器报表设置如下:

 CrystalReportViewer.ReportSource = "C:\reportname.rpt";

在我的实际 RPT 报告文件中,我保存了连接字符串,因此 Crystal Report Viewer 不会提示用户输入用户名和密码。

我的问题是找出是否可以更改保存在报告文件中的连接字符串?将 RPT 文件加载到 Crystal Reports Viewer 时如何设置连接字符串信息?

提前感谢您的帮助...

【问题讨论】:

【参考方案1】:
Private Sub RecurseAndRemap(ByVal CR As Engine.ReportDocument)
        For Each DSC As CrystalDecisions.Shared.IConnectionInfo In CR.DataSourceConnections
            DSC.SetLogon("YourUserName", "YourPassword")
            DSC.SetConnection("YouServerName", "YourDatabaseName", False)
        Next

        CR.SetDatabaseLogon("YourUserName", "YourPassword")

        For Each Table As Engine.Table In CR.Database.Tables
            Table.LogOnInfo.ConnectionInfo.UserID = "YourUserName"
            Table.LogOnInfo.ConnectionInfo.Password = "YourPassword"
        Next

        If Not CR.IsSubreport Then
            For Each SR As Engine.ReportDocument In CR.Subreports
                RecurseAndRemap(SR)
            Next
        End If
    End Sub

【讨论】:

再次,我在我的 ASP.NET 项目中尝试了这个,当我得到“没有可用的有效报告源”时。不过感谢您的帮助。【参考方案2】:

我不确定 web 查看器是否与 winforms 查看器相同,但我最终要做的是创建一个新的 ReportDocument,将报表文件加载到 ReportDocument 中,然后更改所有连接信息.

ReportDocument currentReport = new ReportDocument();  
currentReport.Load([path to .rept], OpenReportMethod.OpenReportByTempCopy);
ConnectionInfo crConnectionInfo = new ConnectionInfo();

//Set your connection params here  

for (int i = 0; i < currentReport.Database.Tables.Count; i++)

    Table crTable = currentReport.Database.Tables[i];
    TableLogOnInfo crTableLogOnInfo = crTable.LogOnInfo;
    crTableLogOnInfo.ConnectionInfo = crConnectionInfo;
    crTable.ApplyLogOnInfo(crTableLogOnInfo);


foreach(IConnectionInfo cn in currentReport.DataSourceConnections)

    cn.SetConnection(_server, _database, _windowsAuth);        
    cn.SetLogon(_userName, _password);
  

然后只需将您的报表查看器源设置为报表对象:

CrystalReportViewer.ReportSource = currentReport;

【讨论】:

crTableLogOnInfo 是在哪里定义的?这看起来不错,感谢您的帮助,但是,如果每个报告有多个数据源,您知道我应该怎么做吗?谢谢, 糟糕。编辑将crTableLogOnInfo 定义为TableLogOnInfo 类型。我想如果每个报告有多个数据源,您可以在编辑每个数据源时检查它,并根据该信息决定您希望它现在指向的位置。 谢谢,我最好在 web.config 文件中定义连接字符串,但这似乎不支持。有没有一种方法可以轻松定义我是使用 oracle 还是 Sql 服务器,或者只是将连接字符串换成 web.config 文件中的连接字符串? 是的,我不知道有什么方法可以换出报告连接类型并使用连接字符串设置它们的属性。在我们所有的报告中,我们都使用 ODBC 连接,因此提供用户名/密码就足够了。 谢谢,我尝试使用上面的代码,但我收到错误“没有可用的有效报告源”。当我单步执行代码时,我没有收到任何错误...

以上是关于更改 Crystal Reports 查看器连接字符串 ASP.NET的主要内容,如果未能解决你的问题,请参考以下文章

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

创建从 Crystal Reports 到 Azure Synapse Analytics 的服务主体连接

Crystal Reports for VS 2008 - “找不到用户函数管理器DLL(ufmanager.dll)。”

如何将我的 java swing 应用程序的连接传递到 Crystal Reports XI?

配置 Crystal Reports 所需的帮助

Crystal Reports 要求数据库登录信息?