在VS 2005中更改Crystal报表的Catalog属性

时间:2008-09-24 14:54:46

标签: visual-studio crystal-reports

我正在处理现有报告,我想用数据库对其进行测试。问题是初始报告创建期间设置的目录不再存在。我只需要将catalog参数更改为新数据库。该报告使用存储过程来获取其数据。看起来如果尝试删除proc以重新添加它,报告上的所有字段都将消失,我将不得不重新开始。

我在Studio的设计师工作,只需调整catalog属性即可进行预览。我有代码正在从程序中正确处理事情。

2 个答案:

答案 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)

编辑:看到你的编辑,所以我会保留我原来的帖子,但不得不说..我在VS的设计模式中从未有过水晶报告,所以我不能帮助对不起。

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));
            }
        }
    }