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