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

Chr*_*ide 7 .net c# crystal-reports crystal-reports-2008

我目前正在使用C#中的程序,它允许我们的用户运行,查看和导出一批Crystal Reports.报告是使用Crystal Reports 2008 GUI完成的.这样做的主要原因之一是允许我们在Crystal Report导出为PDF时保留超链接.我的程序通过导出到rtf,然后将rtf转换为pdf来完成此操作.如果有人知道在转换为PDf时保留超链接的一种不那么复杂的方法我很乐意听到它,但这不是我当前的问题.

我已经做了很多测试,如何优化我的程序,使出口尽可能少的时间.从我所看到的,对数据进行应用程序查询,然后将结果集绑定到Crystal Report是迄今为止最快的方法.我的问题是我不能将查询硬编码到程序中,需要从Crystal Report本身中检索它们.

在Crystal Reports 2008中,"数据库"菜单下有一个名为"显示SQL查询"的选项.这将打开一个窗口,其中包含用于给定报告的SQL查询.这正是我需要从我的应用程序中获取的东西.我已经加载了一个水晶报告,并在调试时遍历了ReportDocument对象,试图找到查询,但没有运气.

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

Chr*_*ide 2

好吧,所以 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;
}
Run Code Online (Sandbox Code Playgroud)

它看起来有点乱,但是当你开始费力地浏览它时,它就有意义了。基本上,它使用反射来获取 CommandText 属性的值,并添加一些动态来获取 ReportDocument 中的动态属性。

这是为我拉取命令文本,但我没有时间对代码进行任何测试。我确信一旦我有时间处理这个问题,我就会做一些调整。我不知道不使用“SQL 命令”的报告会发生什么。一旦我进一步测试了这一点,我就会发表评论。

  • 斯科特

PS这要求您引用标准反射/动态库,以及以下水晶报表库:

crystaldecisions.reportappserver.datadefmodel

crystaldecisions.crystalreports.engine

crystaldecisions.shared 水晶决策共享