ADO - 我可以使用多个连接语句编辑复杂查询的结果吗?

时间:2012-12-28 21:08:45

标签: sql-server delphi delphi-xe2 ado tadoquery

我正在研究一种数据转换实用程序,它可以将数据从一个主数据库推送到许多不同的数据库。该实用程序本身不知道数据如何保存在目标(表结构)中,但我想提供编写SQL语句以使用具有多个连接语句的复杂SQL查询从目标返回数据。只要数据采用标准化格式,实用程序就可以在ADO查询中识别(字段名称)。

我想要做的是修改此ADO查询中的实时数据。但是,由于有多个连接语句,我不确定是否可以这样做。我至少知道BDE(我从未使用过BDE),它非常严格,你必须返回所有字段(*)等。我知道ADO更灵活,但我不知道在这种情况下有多灵活。

当结果包含来自不同表的字段时,是否可以以这种方式修改TADOQuery中的数据?即使如此,假设我想在最后添加一条新记录(TADOQuery.Append)。它会附加到两个不同的表吗?

我选择的实际主表具有一个互补表,该表由相同的主键字段连接,一个是“小”表(简要信息),另一个是“详细信息”表(更多信息为小表中的每条记录)。因此,典型的陈述将包括以下内容:

select ts.record_uid, ts.SomeField, td.SomeOtherField from table_small ts
join table_detail td on td.record_uid = ts.record_uid

其他表中还有许多其他记录连接,但我并不担心会附加到那些记录中。我只是担心在同一时间附加到“小”和“细节”表格。

在ADO查询中是否可以这样做?我愿意以任何必要的方式调整和修改SQL语句,以实现这一点。我感觉不好,但这是不可能的。

兼容性:

  1. SQL Server 2000到2008 R2
  2. Delphi XE2

3 个答案:

答案 0 :(得分:6)

编辑这些对连接没有影响的字段通常没问题。 附加是......您可以通过

将附加限制为其中一个表
procedure TForm.ADSBeforePost(DataSet: TDataSet);
begin
  inherited;
  TCustomADODataSet(DataSet).Properties['Unique Table'].Value := 'table_small';
end;

但如果没有Requery,你将无法进一步发展。 更好的方法是按程序设置值,例如在BeforePost,Requery和Abort。

如果您的视图会持续存在,则可以使用INSTEAD OF Triggers

答案 1 :(得分:2)

杰里,

我在FireBird上遇到了同样的问题,根据经验我可以告诉你,使用CachedUpdates可以做到(最小的复杂性)。这是一个非常好的资源 - http://podgoretsky.com/ftp/Docs/Delphi/D5/dg/11_cache.html。本文解答了您的所有问题。

答案 2 :(得分:0)

我已经放弃了实时ADO查询更新的最初想法,因为它变得比我能够解决的问题更复杂。数据推送项目的范围已经改变,因此这不再是我的问题,但仍然是一个有趣的主题。

应用程序的新结构包括在原始数据集的各个字段上附加多个“字段链接”。这些链接中的每一个都引用原始字段名称和在导入该字段时要执行的SQL语句。多个字段链接可以在一个字段上,因此可以执行多个语句,将值放在各个表中等等。最终目标是一个应用程序,我可以轻松地重复将原始数据集从原始源导出到任何外部源不同的数据结构,无需重新编译应用程序。

然而,缓存更新的概念对我来说并不吸引人,仅仅是因为RBA答案中的链接指出的事实是数据可以在平均时间内在数据库中更改。所以我将集成我自己的可自定义数据推送方法。