2

假设我有一个应用程序从代表数据集的服务器获取自定义 XML 数据包。然后,假设我希望通过数据集对该数据执行 SQL 语句。我可以用什么来做到这一点?我不一定需要知道代码,而只需要知道使用什么来使这成为可能以及如何进行的一般解释。

例如,我可以从服务器获取 XML 格式的客户列表。然后,我可以使用任何第三方解析器将 XML 数据转储到某个客户端数据集中。然后,对该数据集执行查询,例如select * from customers where ZipCode = '12345'无需再次从服务器获取该数据。

XML 不是唯一的限制,这只是一个示例。我可能想对从 INI 文件加载的某些应用程序设置执行相同的操作。无论哪种方式,概念是数据的原始来源是未知的。

数据集是否将其临时数据存储在内存中或磁盘上并不重要,但如果它可以将其保存在磁盘中,那就太好了。

4

3 回答 3

8

TXQuery (http://code.google.com/p/txquery/) is a component that provides a local SQL engine for executing SQL queries against one or more TDataSets. The only issues I have had with it is updating data via a TDBGrid of a query joining multiple tables (TDataSets) - specifically which table is being updated.

AnyDac v6 (now FireDac) also has a local SQL engine. http://www.da-soft.com/anydac/docu/frames.html?frmname=topic&frmfile=Local_SQL.html

Edit: For the example SQL in your question, because it only involves a single table, you do this with just a Filter on the datatset. For example

ADataSet.Filtered := False;
ADataSet.Filter := 'ZipCode=' + QuotedStr('12345');
ADataSet.Filtered := True;
于 2013-04-28T01:04:19.613 回答
4

这样的功能可以使用本地数据库来完成。您只需将TDataSet结果插入到本地内存(或基于文件)的独立数据库中,然后就可以对其使用常规 SQL 查询,包括 JOIN。

例如,您可以使用SQLite3NexusDB的免费版。

NexusDB 嵌入式具有作为原生 Delphi 数据库的优势,因此请坚持使用DB.pas TDataSet范式。

另一种选择是使用 SQLite3 的所谓虚拟表机制,它允许向 SQLite3 引擎公开任何数据(甚至来自 TDataSet、XML、JSON 或内存中的对象),就像常规表一样。然后,您可以在这些“虚拟”表(包括 JOIN)上运行 SQL 语句。使用这种方法,您不需要将数据插入到常规表中,但数据仍保持其原始形式。当然,你会错过一些性能特性,比如索引,这些特性应该在虚拟表提供者端处理。我们使用这个特性作为我们mORMot ORM/SOA 框架的数据库核心,这个功能非常强大。

于 2013-04-28T07:43:21.870 回答
2

您要执行的一般过程由于数据表示的差异而变得复杂。SQL 数据存储在由可区分记录组成的表中。XML 是数据的结构化表示,但采用树形而不是表/行形式。

这些数据形式中的每一个都可以通过为数据提供上下文的模式来限定。

您可以遵循两条一般路径:

  1. 获取 XML,并基于模式将其插入一组相互关联的表中,然后执行 SQL 查询。- 如果您有架构,您可以使用代码生成器来制作解析器,然后基于解析树,您可以插入到本地数据库中,并使用动态构建的表。您可以从https://dev.mysql.com/doc/refman/5.7/en/installing.html轻松设置我的 SQL ,然后在您的 delphi 版本中连接到数据库,首先填写,然后询问。这将满足您将数据存储在磁盘上的愿望。除非您在完成后清除表,否则数据在本地计算机数据库中仍然可用。

这似乎比:

  1. 使用 Xpath 或 Xquery 并直接处理 XML。为此,您最喜欢的环境中的 saxon 或 python 中的 expat 这样的包会很好地工作。

让我知道这些路径中的任何一条是否看起来都可能富有成效。

于 2013-04-27T22:48:28.950 回答