我正在处理现有报告,我想用数据库对其进行测试。问题是初始报告创建期间设置的目录不再存在。我只需要将catalog参数更改为新数据库。该报告使用存储过程来获取其数据。看起来如果尝试删除proc以重新添加它,报告上的所有字段都将消失,我将不得不重新开始。
我在Studio的设计师工作,只需调整catalog属性即可进行预览。我有代码正在从程序中正确处理事情。
答案 0 :(得分:2)
如果您只需要在设计器中执行此操作,请右键单击某个空白区域,然后单击Database->设置数据源位置。从那里,您可以使用当前连接或添加新连接。使用新目录设置新连接。然后单击顶部的当前连接,然后单击“更新”。您的数据源将发生变化。但是如果你需要在运行时这样做,那么下面的代码是最好的方式。
#'SET REPORT CONNECTION INFO
For i = 0 To rsource.ReportDocument.DataSourceConnections.Count - 1
rsource.ReportDocument.DataSourceConnections(i).SetConnection(crystalServer, crystalDB, crystalUser, crystalPassword)
Next
答案 1 :(得分:0)
report.SetDatabaseLogon(UserID, Password, ServerName, DatabaseName);
之后,您必须遍历报表中的所有引用表,并通过子报表递归并根据报告connectioninfo将其logoninfo重置为一个。
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));
}
}
}