1

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

3 回答 3

6

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

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

但如果没有 Requery,您将不会走得更远。更好的方法是按过程设置值,例如在 BeforePost、Requery 和 Abort 中。

如果您的视图是持久的,您将能够使用INSTEAD OF 触发器

于 2012-12-28T21:38:15.163 回答
2

杰瑞,

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

于 2012-12-29T08:40:48.967 回答
0

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

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

However the concept of cached updates was not appealing to me, simply for the fact pointed out in the link in RBA's answer that data can be changed in the database in the mean-time. So I will instead integrate my own method of customizable data pushes.

于 2012-12-29T09:42:57.013 回答