【问题标题】:Delphi ADO Query - Concatenate result setsDelphi ADO 查询 - 连接结果集
【发布时间】:2009-09-22 13:43:12
【问题描述】:

我正在编写一个允许用户向多个系统提交查询的应用程序。然后,我使用 SaveToFile 保存来自每个系统的每个报告,该文件将其保存为 XML 文档。

然后,用户可以通过从菜单中选择报告来检查每个报告,然后通过将报告加载回 ADO 查询组件(使用 LoadFromFile)然后将其链接到列表视图来显示报告。

现在,我的问题是用户需要能够选择任何或所有报告并将它们连接在一起以创建一个大型报告。例如:

用户可以将查询定义为 SELECT * FROM (table),然后他可以在系统 A、系统 B 和系统 C 上运行此查询。他需要选择加入而不是查看三个单独的报告将三个系统的报告放在一起,这样他就可以只看一个大报告,涵盖所有三个系统。

是否可以使用 ADO 查询组件来做到这一点?如果不是,由于文件保存为 XML 文档,是否可以使用 XML 文档将报告连接在一起?

我不知道从哪里开始,所以任何指针都将不胜感激。

编辑:起初我不知何故忘记包含的重要信息:

  1. 用户需要能够离线访问数据 - 即他需要能够在各种系统上运行查询,然后在以后使用报告。因此,当未连接到运行查询的任何系统时,需要能够将报告保存到磁盘,然后在以后重新加载它们。用户此时可能想要连接报表。

  2. 要连接在一起的所有报告将具有完全相同的类型 - 即它们都将由同一查询生成,因此将提供相同数量/类型的字段等。

【问题讨论】:

  • 系统 A 表示在特定系统上运行的数据库。系统 B 表示在不同系统上运行的数据库等。

标签: xml delphi ado


【解决方案1】:

您可以创建一个 ClientDataSet 并将所有来源的结果附加到一个数据集中,而不是将它们保存为单独的 XML 文件。这将让您一次查看所有结果,或者一次只查看一个来源。 ClientDataSet 的内容可以保存为单个文件,应该比处理多个文件更容易。

当然,这假设您从所有来源获得相似的数据(相同的列)。

【讨论】:

  • 这看起来很有希望,因为它允许我最初将报告保存到磁盘(就像我目前所做的那样,作为 XML 文档),然后将它们重新加载到 ADO 查询组件中脱机(自您的回答以来,请参阅我对原始问题的修改)。有人可以扩展一下吗?我以前从未使用过 ClientDataSet,尽管我目前正在研究它,但一个示例将非常有用。谢谢!
  • 将 MidasLib 添加到您的 uses 子句中,然后将 TClientDataSet(从组件面板的 Data Access 选项卡中)拖放到您的数据模块上。您可以定义字段等,就像任何其他表一样。您可能想查看delphi.about.com/od/usedbvcl/a/tclientdataset.htm 以及该页面上的可用链接。
  • 小心。如果您使用的是 Delphi 2009,MidasLib 单元中存在内存泄漏,您最好将 midas.dll 添加到您的安装中。不过,它已在 2010 年修复。不确定早期版本。
  • OK - 我使用了一个 TClientDataSet 并将来自多个 TADOQuery 组件的结果附加到 TClientDataSet 中。现在,我的问题是我需要以 TADOQuery 使用的相同格式将数据保存回文件(即使用 pfXML 参数在 TADOQuery 中调用 SaveToFile 过程)。从 TClientDataSet 调用 SaveToFile 会以不同的格式保存它。查看结果的处理读取 pfXML - 那么如何将数据返回到 TADOQuery 以便可以以这种格式保存?我可以使用 TADOQuery 查询 TClientDataSet 吗?
【解决方案2】:

我刚刚完成调查。我的应用程序允许用户通过查询他们的数据库来生成报告。我可以让它工作,它对于小型结果集非常有效 - 但是,由于这是一个报告应用程序,完全有可能返回数十万条记录,使用 ClientDataSet 会产生大量性能问题。一旦您获得超过 50,000 条记录(考虑到客户群,这是合理的),处理开始呈指数级增长,因此现在基本上没有实际意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多