我想从Crystal Report的.rpt文件中提取SQL查询,有办法可以做到吗?

17

我想从Crystal Report的.rpt文件中提取SQL查询语句,有没有办法做到这一点?

我没有Crystal Reports产品,只有.rpt文件。

6个回答

17

以下是一个 .Net 示例代码,它可以从给定目录中的所有 Crystal Reports 报表中获取 Command Sql。它需要安装 Crystal 2008 .Net SDK(您可以从 SAP 下载试用版)。

foreach (string file in Directory.GetFiles("c:\\projects\\Reports", "*.rpt"))
{
    Console.WriteLine(String.Format("Processing {0}...", file));
    var doc = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
    doc.Load(file);

    foreach (dynamic table in doc.ReportClientDocument.DatabaseController.Database.Tables)
    {
        if (table.ClassName == "CrystalReports.CommandTable")
        {
            string commandSql = table.CommandText;

            //TODO: do something with commandSql
        }
    }
}
要获取与运行报表时Crystal构建的SQL相同的SQL,请参见此链接:SAP Note 1280515 - How to extract SQL query from Crystal reports using RAS sdk. 我认为,要做到这一点,您需要提供报表参数值,以便Crystal能够连接到数据库以构建SQL。在此示例中,由于使用了Report Viewer控件,Crystal可以提示用户输入参数。

1
您真厉害。只是想指出,我也试图为子报表做同样的事情。然而,这不受支持。您唯一的选择是将子报表保存在主报表之外,并作为“ReportDocument”打开它们,这样您就可以访问Interop类了。哦,别忘了添加CrystalDecisions.ReportAppServer.ClientDocCrystalDecisions.ReportAppServer.ControllersCrystalDecisions.ReportAppServer.DataDefModel,否则它就无法编译。 - tfrascaroli

7
在“Crystal Reports ActiveX 设计器设计和运行时库”(craxddrt.dll)中,Report.SQLQueryString 属性可以实现您想要的功能。
我似乎找不到 .Net SDK 中相应的属性,相信我,我一直在寻找。
** 编辑 **
看起来可以利用 In-Process RAS Server 来获取此信息:

CrystalDecisions.ReportAppServer.DataDefModel.CommandTableClass.CommandText


4
另一种解决方法是,如果您可以运行报告,则可以将SQL Profiler连接到您的数据库,并在数据库端捕获传入的SQL。

2

JoshL的回答对我的一些报告起作用了,但并非全部。使用ReportClientDocument.RowsetController.GetSQLStatement方法,能够提取其他方法遗漏的一些查询。

foreach (string file in Directory.GetFiles("c:\\projects\\Reports", "*.rpt"))
{
    Console.WriteLine(String.Format("Processing {0}...", file));
    var doc = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
    doc.Load(file);

    var controller = doc.ReportClientDocument.RowsetController;

    var groupPath = new CrystalDecisions.ReportAppServer.DataDefModel.GroupPath();
    string temp = String.Empty;
    string commandSql = controller.GetSQLStatement(groupPath, out temp);
    //TODO: do something with commandSql
}

CrystalDecisions 命名空间只能从 SDK 中获取,还是可以在 Crystal Reports 2016 应用程序中找到?这些工具有文档吗? - dougp

-1
在Visual Studio中,选择.rpt文件并进入字段资源管理器,在DatabaseFields上右键单击。点击SQL查询选项以查看查询语句。

-1

我的经验是使用较旧版本的Crystal(8,9)-我不知道更近期版本的文件格式是什么样子的。然而,最好还是用文本编辑器打开文件,以防万一,但对于我看到的文件格式,查询文本无法通过这种方式访问。

如果我没记错的话,某些版本的Visual Studio 2003附带了用于操作Crystal .rpt文件的工具(但我猜这对您没有太大用处,因为如果您已经拥有此工具,您就不会提出这个问题!)。

这不是一个非常有想象力的建议,但也许您最快的路线是下载当前Crystal Reports的30天试用版,看看是否可以为您打开这些文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接