我正在处理现有报告,我想用数据库对其进行测试。问题是在初始报告创建期间设置的目录不再存在。我只需要将目录参数更改为新数据库。该报告为其数据使用存储过程。看起来如果尝试删除 proc 以重新添加它,报告上的所有字段都会消失,我将不得不重新开始。
我在 Studio 的设计器中工作,只需要调整目录属性即可获得预览。我有代码可以从程序中正确处理事情。
我正在处理现有报告,我想用数据库对其进行测试。问题是在初始报告创建期间设置的目录不再存在。我只需要将目录参数更改为新数据库。该报告为其数据使用存储过程。看起来如果尝试删除 proc 以重新添加它,报告上的所有字段都会消失,我将不得不重新开始。
我在 Studio 的设计器中工作,只需要调整目录属性即可获得预览。我有代码可以从程序中正确处理事情。
如果您只需要在设计器中执行此操作,则右键单击一些空白并单击数据库-> 设置数据源位置。从那里您可以使用当前连接或添加新连接。使用新目录设置新连接。然后单击顶部的当前连接,然后单击更新。您的数据源将发生变化。但是如果您需要在运行时执行此操作,那么以下代码是最好的方式。
#'SET REPORT CONNECTION INFO
For i = 0 To rsource.ReportDocument.DataSourceConnections.Count - 1
rsource.ReportDocument.DataSourceConnections(i).SetConnection(crystalServer, crystalDB, crystalUser, crystalPassword)
Next
编辑:看到你的编辑,所以我会保留我原来的帖子,但不得不说..我从来没有在 VS 的设计模式下有过水晶报告,所以对不起,我帮不上什么忙。
report.SetDatabaseLogon(UserID, Password, ServerName, DatabaseName);
之后,您必须遍历报告中所有引用的表并递归子报告并根据报告连接信息将其登录信息重置为一个。
private void FixDatabase(ReportDocument report)
{
ConnectionInfo crystalConnectionInfo = someConnectionInfo;
foreach (Table table in report.Database.Tables)
{
TableLogOnInfo logOnInfo = table.LogOnInfo;
if (logOnInfo != null)
{
logOnInfo.ConnectionInfo = crystalConnectionInfo;
table.LogOnInfo.TableName = table.Name;
table.LogOnInfo.ConnectionInfo.UserID = someConnectionInfo.UserID;
table.LogOnInfo.ConnectionInfo.Password = someConnectionInfo.Password;
table.LogOnInfo.ConnectionInfo.DatabaseName = someConnectionInfo.DatabaseName;
table.LogOnInfo.ConnectionInfo.ServerName = someConnectionInfo.ServerName;
table.ApplyLogOnInfo(table.LogOnInfo);
table.Location = someConnectionInfo.DatabaseName + ".dbo." + table.Name;
}
}
//call this method recursively for each subreport
foreach (ReportObject reportObject in report.ReportDefinition.ReportObjects)
{
if (reportObject.Kind == ReportObjectKind.SubreportObject)
{
this.FixDatabase(report.OpenSubreport(((SubreportObject)reportObject).SubreportName));
}
}
}