【问题标题】:ADO - Can I edit results of a complex query with multiple join statements?ADO - 我可以使用多个连接语句编辑复杂查询的结果吗?
【发布时间】:2012-12-28 21:08:44
【问题描述】:

我正在开发一种数据转换实用程序,它可以将数据从一个主数据库推送到多个不同的数据库。该实用程序本身不知道数据如何保存在目标(表结构)中,但我想提供编写一个 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. 德尔福 XE2

【问题讨论】:

  • 你可以把整个事情写成一个 SQL 存储过程,然后通过 ADO 从你的 Delphi 程序中执行。
  • 似乎在一定程度上是有可能的,使用我的两张表无论如何都匹配在一起。当我介绍其他查找表时,它开始变得混乱,并且不允许我设置这些值。仍在试图弄清楚我可以在多大程度上修改这些数据。
  • 还有确保主键字段(身份规范)完美匹配的问题。如果我决定写入其中任何一个,我必须确保我追加到两个表中。
  • @Jerry Dodge:您对 BDE 的评论是错误的:可以完全控制返回的字段。您可能一直在考虑“实时查询”:无法编辑基于从多个表中提取的数据的查询。
  • 我从来没有真正使用过我提到的 BDE,这只是我听说的。我只是在使用 ADO。

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


【解决方案1】:

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

将附加限制到其中一个表
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。本文为您解答所有问题。

    【讨论】:

    • 不要将BDE 用于缓存更新,将其限制为TClientDataSet
    • @JeroenWiertPluimers - 您能否提供更详细的答案,我也因类似的问题而头疼。
    • Cary Jensen 写了一本关于使用TClientDataSet 的优秀书籍,包括缓存更新:jensendatasystems.com/cdsbook
    • 在我的例子中,每个数据库都有一个共同的模式,描述了结构是如何布局的。
    【解决方案3】:

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

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

    但是,缓存更新的概念对我没有吸引力,只是因为 RBA 答案中的链接中指出的事实是,同时可以在数据库中更改数据。因此,我将改为集成我自己的可定制数据推送方法。

    【讨论】:

    • 我遇到的问题的真正核心是处理这个导入过程的最理想方法,这在 StackOverflow 上问得太主观了。我把它缩小到这个问题最有可能的情况。然而,在看到它有多困难之后,我已经改变了路径。我的新结构进展顺利,非常适合我的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2011-03-22
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    相关资源
    最近更新 更多