Crystal Reports ApplyLogOnInfo 从来都不起作用

本文关键字:不起作用 Reports ApplyLogOnInfo Crystal | 更新日期: 2023-09-27 18:31:11

目前,我厌倦了尝试在水晶报告中解决此问题。我们有 3 个环境,开发、生产(共享)和本地计算机部署。如果我与开发中的生产环境不完全匹配,则 Crystal 报表永远不会显示报表。我通过所有论坛进行了大量研究,并尝试了每一个解决方案。不管我尝试什么,当我尝试应用新的登录信息时,它永远不会起作用,当我循环表以测试连接时,它只是在最后失败:

foreach (CrystalDecisions.CrystalReports.Engine.Table table in document.Database.Tables)
{
    TableLogOnInfo tableLogOnInfo = table.LogOnInfo;
    tableLogOnInfo.ConnectionInfo = info.ConnectionInfo;
    table.ApplyLogOnInfo(tableLogOnInfo);
    if (!table.TestConnectivity())
    {
        string msg = ("Failed to apply log in info for Crystal Report");
        throw new ApplicationException(msg);
    }
}

如果我更改了无效的用户或密码,则先前在SetConnection或SetDatabaseLogon中失败。我知道存在无法从集成安全性更改为非集成安全性的错误,因此我将自己的数据库设置为使用常规用户和密码凭据。

我可以清楚地看到未设置连接,因为我在我的开发计算机中设置了无效的密码,它会失败,但如果我继续,我会看到报告。在生产计算机中,它总是失败,也不会显示报告(出于调试目的跳过错误)。所以似乎连接是硬编码的,无法更改。

有什么想法吗?我可以发布所有代码来更改连接信息,但我认为这不值得,这是众所周知的。

溶液

就像许多人告诉我的那样,没有一个单一的解决方案。似乎根据水晶报告版本,它的工作方式不同。就我而言,以下解决方案适用于水晶报告 10.5.3700。

public static void CrystalReportLogOn(ReportDocument reportParameters, string serverName, string databaseName, string userName, string password)
{
    TableLogOnInfo logOnInfo;
    ReportDocument subRd;
    Sections sects;
    ReportObjects ros;
    SubreportObject sro;
    if (reportParameters == null)
    {
        throw new ArgumentNullException("reportParameters");
    }
    try
    {
        foreach (CrystalDecisions.CrystalReports.Engine.Table t in reportParameters.Database.Tables)
        {
            logOnInfo = t.LogOnInfo;
            logOnInfo.ReportName = reportParameters.Name;
            logOnInfo.ConnectionInfo.ServerName = serverName;
            logOnInfo.ConnectionInfo.DatabaseName = databaseName;
            logOnInfo.ConnectionInfo.UserID = userName;
            logOnInfo.ConnectionInfo.Password = password;
            logOnInfo.TableName = t.Name;
            t.ApplyLogOnInfo(logOnInfo);
            t.Location = t.Name;
        }
    }
    catch
    {
        throw;
    }
    sects = reportParameters.ReportDefinition.Sections;
    foreach (Section sect in sects)
    {
        ros = sect.ReportObjects;
        foreach (ReportObject ro in ros)
        {
            if (ro.Kind == ReportObjectKind.SubreportObject)
            {
                sro = (SubreportObject)ro;
                subRd = sro.OpenSubreport(sro.SubreportName);
                try
                {
                    foreach (CrystalDecisions.CrystalReports.Engine.Table t in subRd.Database.Tables)
                    {
                        logOnInfo = t.LogOnInfo;
                        logOnInfo.ReportName = reportParameters.Name;
                        logOnInfo.ConnectionInfo.ServerName = serverName;
                        logOnInfo.ConnectionInfo.DatabaseName = databaseName;
                        logOnInfo.ConnectionInfo.UserID = userName;
                        logOnInfo.ConnectionInfo.Password = password;
                        logOnInfo.TableName = t.Name;
                        t.ApplyLogOnInfo(logOnInfo);
                    }
                }
                catch
                {
                    throw;
                }
            }
        }
    }
}

我尝试的所有其他解决方案都不起作用。

Crystal Reports ApplyLogOnInfo 从来都不起作用

我有类似的问题。您使用的是哪个版本的 Crystal 报告很重要。对于某些版本,如果除了应用登录信息之外设置表位置,则报告将起作用。

您是尝试在运行时设置报告连接,还是也为不同的环境设置了单独的报告?我们发现创建不同的报表环境更容易(但我们只有 2 个:开发和生产)。这使我们能够设置一次连接信息 - 当我们将报告从开发移动到生产时。我们内部开发的工具很少,这些工具负责不同的报告版本。现在我们正在使用这个第三方工具:http://www.r-tag.com/Pages/CRDataSource.aspx 它似乎可以正确处理所有版本,但仅适用于每个报告的一个连接。