Crystal Reports ApplyLogOnInfo永远不会起作用

Max*_*ios 13 c# crystal-reports winforms

目前我已经厌倦了尝试在Crystal Reports中修复此问题.我们有3个环境,即生产(共享)中的开发,部署和本地计算机.如果我与开发中的生产环境不完全匹配,Crystal Reports从不显示报告.我通过所有论坛进行了大量研究,并尝试了每一个解决方案.无论我尝试什么,当我尝试应用新的登录信息时它永远无法工作,当我循环表来测试连接时,它最终会失败:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

像许多人告诉我的那样,没有一个解决方案.它似乎取决于Crystal Reports版本,它的工作方式不同.在我的例子中,以下解决方案适用于Crystal Reports 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;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过的其他所有解决方案根本不起作用.

小智 3

我有类似的问题。您使用的 Crystal 报表版本很重要。对于某些版本,如果您除了 ApplyLogOnInfo 之外还设置表位置,则报告将起作用。

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