如何检索Crystal报表中使用的SQL SELECT语句?

本文关键字:SQL SELECT 语句 报表 何检索 检索 Crystal | 更新日期: 2023-09-27 18:14:36

我目前正在用c#编写一个程序,它允许我们的用户运行、查看和导出一批Crystal报表。这些报告是使用Crystal reports 2008 GUI制作的。这样做的一个主要原因是允许我们在Crystal Report导出为PDF时保留超链接。我的程序通过导出为rtf,然后将rtf转换为pdf来实现这一点。如果有人知道在转换为PDf时保存超链接的更简单的方法,我很乐意听到,但这不是我目前的问题。

我已经做了很多测试如何优化我的程序,使导出花费尽可能少的时间。从我所看到的来看,让应用程序查询数据,然后将结果集绑定到Crystal Report是迄今为止最快的方法。我的问题是,我不能硬编码的查询到程序,他们需要从水晶报告本身检索。

在Crystal Reports 2008中,在Database菜单下有一个名为"Show SQL Query"的选项。这将弹出一个窗口,其中包含用于给定报告的SQL查询。这正是我需要从我的应用程序中得到的东西。我已经加载了一个水晶报告,并且在调试时遍历了ReportDocument对象,试图找到查询,但是没有运气。

我的问题是;是否有任何可用的方法可以让我提取给定Crystal Report使用的查询?

如何检索Crystal报表中使用的SQL SELECT语句?

我知道这是一个非常古老的问题,但我认为我将为那些偶然发现这个问题但需要3.5框架目标的人提供一个替代方案(3.5中不提供动态)。

要使此解决方案工作,您将需要以下参考。

using CrystalDecisions.ReportAppServer.DataDefModel;
using CrystalDecisions.CrystalReports.Engine;

然后使用以下命令访问ClientDoc接口并返回命令文本字符串列表。

    private static List<string> GetCommandText(CrystalDecisions.CrystalReports.Engine.ReportDocument report)
    {
        var rptClientDoc = report.ReportClientDocument;
        return rptClientDoc.DatabaseController.Database.Tables.OfType<CommandTable>()
              .Select(cmdTbl => cmdTbl.CommandText).ToList();
    }

好了,dotjoe给了我解决这个问题所需的所有提示。下面的代码可用于从水晶报表中提取命令文本。

public string getCommandText(ReportDocument rd)
{
    if (!rd.IsLoaded)
        throw new ArgumentException("Please ensure that the reportDocument has been loaded before being passed to getCommandText");
    PropertyInfo pi = rd.Database.Tables.GetType().GetProperty("RasTables", BindingFlags.NonPublic | BindingFlags.Instance);
    return ((dynamic)pi.GetValue(rd.Database.Tables, pi.GetIndexParameters()))[0].CommandText;
}

它看起来有点乱,但当你开始费力地阅读它时,它会有某种意义。基本上,它使用反射来获取CommandText属性的值,并加入一些动态元素来获取ReportDocument中的动态属性。

这是为我拉命令文本,但是我没有时间对代码做任何测试。我相信我会做一些调整,一旦我有时间工作。我不知道不使用"SQL命令"的报告会发生什么。我将在进一步测试后发表评论。

    斯科特

注:这需要您引用标准反射/动态库,以及以下Crystal Report库:

crystaldecisions.reportappserver。datadefmodel

crystaldecisions.crystalreports.engine

crystaldecisions.shared