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它似乎可以正确处理所有版本,但仅适用于每个报告的一个连接。