当前位置: 首页 > 编程语言 > C#

如何检索水晶报表中使用的SQLSELECT语句?分享

时间:2023-04-10 12:11:02 C#

如何检索水晶报表中使用的SQLSELECT语句?我目前正在开发一个C#程序,它允许我们的用户运行、查看和导出批量的CrystalReports。报告是使用CrystalReports2008GUI完成的。这样做的主要原因之一是允许我们在将CrystalReports导出为PDF时保留超链接。我的程序通过导出为rtf,然后将rtf转换为pdf来执行此操作。如果有人知道在转换为PDF时保留超链接的不太复杂的方法,我很想听听,但这不是我当前的问题。我已经做了很多测试如何优化我的程序,以便尽可能少地导出。据我所知,对数据进行应用程序查询,然后将结果集绑定到CrystalReport是迄今为止最快的方法。我的问题是我不能将查询硬编码到程序中,它们需要从CrystalReport本身检索。在CrystalReports2008中,“数据库”菜单下有一个名为“显示SQL查询”的选项。这将打开一个窗口,其中包含给定报告的SQL查询。这正是我的应用程序所需要的。我已经加载了一个水晶报表,并在调试时遍历了ReportDocument对象,试图找到查询,但没有成功。所以,我的问题是;有什么方法可以提取给定CrystalReport使用的查询吗?我意识到这是一个非常古老的问题,但我认为我会为偶然发现但需要3.5(动态在3.5中不可用)的框架目标提供替代方案。要使此解决方案起作用,您需要以下参考资料。使用CrystalDecisions.ReportAppServer.DataDefModel;使用CrystalDecisions.CrystalReports.Engine;然后使用以下命令访问ClientDoc界面并返回命令文本字符串列表。私有静态列表GetCommandText(CrystalDecisions.CrystalReports.Engine.ReportDocument报告){varrptClientDoc=report.ReportClientDocument;返回rptClientDoc.DatabaseController.Database.Tables.OfType().Select(cmdTbl=>cmdTbl.CommandText).ToList();好吧,dotjoe给了我解决这个问题所需的所有提示。以下代码可用于从Crystal报表中提取命令文本。publicstringgetCommandText(ReportDocumentrd){if(!rd.IsLoaded)thrownewArgumentException("请确保reportDocument在传递给getCommandText之前已经加载");PropertyInfopi=rd.Database.Tables.GetType().GetProperty("RasTables",BindingFlags.NonPublic|BindingFlags.Instance);返回((动态)pi.GetValue(rd.Database.Tables,pi.GetIndexParameters()))[0].CommandText;}看起来有点乱,但是当你开始涉水的时候,还是有些道理的。基本上,它使用反射来获取CommandText属性的值,并引入了一点动态来传递ReportDocument中的动态属性。这是为我提取命令文本,但我还没有时间对代码进行任何测试。一旦我有时间处理这个问题,我确定我会做一些调整。如果不使用“SQL命令”,我不知道报告会发生什么。一旦我进一步测试,我会发表评论。PS这需要你参考标准的反射/动态库以及以下水晶报表库:在水晶报表中?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: