【问题标题】:I would like to extract the SQL queries from Crystal Report .rpt files, is there a way to do this?我想从 Crystal Report .rpt 文件中提取 SQL 查询,有没有办法做到这一点?
【发布时间】:2018-06-01 03:16:52
【问题描述】:

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

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

【问题讨论】:

    标签: sql crystal-reports report


    【解决方案1】:

    这是一个 .Net 代码示例,该示例从给定目录中的所有 Crystal Reports 中获取命令 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,请参阅此链接:SAP Note 1280515 - How to extract SQL query from Crystal reports using RAS sdk.

    我相信要做到这一点,您需要提供报表参数值,以便 Crystal 可以连接到数据库以构建 SQL。在示例中,由于使用了报表查看器控件,Crystal 可以提示用户输入参数。

    【讨论】:

    • 你先生是忍者。只是要指出我也试图为子报告这样做。嗯,不支持。您唯一的选择是将子报表保存在主报表之外并将它们打开为ReportDocuments,这样您就可以访问 InterOp 类。哦,别忘了加上CrystalDecisions.ReportAppServer.ClientDocCrystalDecisions.ReportAppServer.ControllersCrystalDecisions.ReportAppServer.DataDefModel,否则它就不会编译。
    【解决方案2】:

    在“Crystal Reports ActiveX Designer 设计和运行时库”(craxddrt.dll) 中,Report.SQLQueryString 属性可以满足您的需求。

    我似乎无法在 .Net SDK 中找到等效的属性,相信我,我一直在寻找。

    ** 编辑 **

    似乎可以利用In-Process RAS Server 来获取此信息:

    CrystalDecisions.ReportAppServer.DataDefModel.CommandTableClass.CommandText

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        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
        }
        

        【讨论】:

          【解决方案5】:

          我的经验是使用较旧版本的 Crystal (8,9) - 我不知道较新版本的文件格式是什么样的。但是,为了以防万一,值得在文本编辑器中打开文件,但对于我见过的文件格式,查询文本无法通过这种方式访问​​。

          如果我没记错的话,Visual Studio 2003 的某些版本附带了用于处理 Crystal .rpt 文件的工具(但我想这对你没有多大用处,因为如果你已经拥有它,你就不会问了!)。

          这不是一个很有想象力的建议,但也许您最快的方法是下载30-day trial version of the current Crystal Reports,看看是否会为您打开文件。

          【讨论】:

            【解决方案6】:

            在 Visual Studio 中,选择 .rpt 文件并转到字段资源管理器,右键单击 DatabaseFields。单击 SQL 查询选项以查看查询。

            【讨论】:

              猜你喜欢
              • 2011-03-15
              • 2011-05-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-07-09
              • 2020-09-26
              • 2011-10-04
              • 1970-01-01
              相关资源
              最近更新 更多