从Crystal Report文件中提取SQL

时间:2014-08-13 17:19:07

标签: c# sql .net crystal-reports

我正在尝试使用C#.net从Crystal Report的.rpt文件中提取选择的SQL。这样,我指的是当你在Crystal Report的菜单中进入Database > Show SQL Query时会看到的SQL。我已经按照another SO question的解决方案,但似乎我没有得到相同的结果。我正在使用这组代码:

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")
        {
            //I will never reach here because table.ClassName is CrystalReports.Table
            string commandSql = table.CommandText;

            //TODO: do something with commandSql
        }
    }
}

由于某些原因,table循环中的动态foreach变量都是CrystalReports.Table类型而不是CrystalReports.CommandTable类型。所以,我没有访问CommandText属性。

Table类型最接近的是我可以在报告中的SQL中获取表名,但不能获取所选列。

如何在Crystal Report文件中提取SQL各列的列和表?

我正在使用Crystal Report .NET SDK 13.0.9 for Visual Studio 2013。

1 个答案:

答案 0 :(得分:2)

这可能是因为报告文件包含DataSet作为源而不是嵌入式SQL查询。

我使用2个报告文件测试了代码,包含嵌入式SQL查询的文件和链接到DataSet的文件。

以下图片显示了table比较后变量ClassName的QuickWatch窗口内容。


包含SQL查询作为来源的报告

enter image description here

显示ClassName = "CrystalReports.CommandTable"


包含DataSet作为来源的报告

enter image description here

显示ClassName = "CrystalReports.Table"