首页 文章

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

提问于
浏览
1

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

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

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

我正在选择的实际主表具有一个互补表,该表由相同的主键字段连接,一个是“小”表(简要信息),另一个是“详细信息”表(更多信息用于每个记录)小 table ) . 所以,一个典型的陈述将包括这样的事情:

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语句,以实现这一点 . 我有一种不好的感觉,虽然这是不可能的 .

兼容性:

  • SQL Server 2000到2008 R2

  • Delphi XE2

3 回答

  • 6

    编辑这些对连接没有影响的字段通常没有问题 . 追加是......您可以将附加限制为其中一个表

    procedure TForm.ADSBeforePost(DataSet: TDataSet);
    begin
      inherited;
      TCustomADODataSet(DataSet).Properties['Unique Table'].Value := 'table_small';
    end;
    

    但如果没有Requery,你将无法获得更多 . 更好的方法是按程序设置值,例如在BeforePost,Requery和Abort中 .

    如果你的视图是持久的,你就可以使用INSTEAD OF Triggers

  • 2

    杰瑞,

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

  • 0

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

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

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

相关问题