我正在尝试使用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。
答案 0 :(得分:2)
这可能是因为报告文件包含DataSet作为源而不是嵌入式SQL查询。
我使用2个报告文件测试了代码,包含嵌入式SQL查询的文件和链接到DataSet的文件。
以下图片显示了table
比较后变量ClassName
的QuickWatch窗口内容。
包含SQL查询作为来源的报告
显示ClassName = "CrystalReports.CommandTable"
包含DataSet作为来源的报告
显示ClassName = "CrystalReports.Table"