更新数据集

时间:2011-06-10 21:43:10

标签: delphi delphi-xe tdataset

假设我有2个数据集:A和B,它们具有相同的列。我想获得“距离路径” - 需要完成的最少操作,将数据集A更改为B。

我可以假设,A和B只包含很少的差异,我正在寻找更好的东西,然后:

  • 删除所有A元素
  • 将所有B的元素插入A

如何归档?

2 个答案:

答案 0 :(得分:3)

如果您知道如何使用SQL:

SELECT a.* FROM a 
LEFT JOIN b on (a.field1 = b.field1 AND a.field2 = b.field2 AND ....)
WHERE b.field1 IS NULL

将为您提供A中不在B中的所有字段。

现在做

INSERT INTO b
  SELECT a.* FROM a 
  LEFT JOIN b on (a.field1 = b.field1 AND a.field2 = b.field2 AND ....)
  WHERE b.field1 IS NULL

然后做(或根据您的需要不做)。

DELETE b FROM b
LEFT JOIN a ON (a.field1 = b.field1 and a.field2 = b.field2 AND ...)
a.field1 IS NULL

现在表ab将是相同的。

像这样的Delphi代码应该可以解决问题,但确切的代码取决于您的数据库和使用的查询组件。

procedure TForm1.equalize(A, B: TDataset);
var
  tablenameA: string;
  tablenameB: string;
  MyQuery: TQuery;
begin
  tablenameA:= IProviderSupport(A).PSGetTableName;
  tablenameB:= IProviderSupport(B).PSGetTableName;
  MyQuery:= TQuery.Create(self);
  MyQuery.Database:= .....
  MyQuery.SQL.Text:= ' INSERT INTO '+tablenameA+' .....
  MyQuery.ExecSQL;
end;

答案 1 :(得分:2)

如果您想了解如何将A转换为B,您需要知道A和B之间的区别。有一个非常简单的通用算法,虽然它可能会更复杂,具体取决于数据集中有多少字段,以及它们中有多少字段可以从A到B不同。但这里有一般概念:

  • 对两个数据集进行排序。确保按照完全相同的标准排序。 (此时,如果它们都包含相同的数据元素集,则如果并排查看,则其内容的两个列表将是相同的。)
  • 从两者的第一项开始 数据集。将这两项与可以返回less thanequalgreater than的比较进行比较。
    • 如果A< B,记下差异并移至A的下一行。
    • 如果A> B,记下差异,然后移到B的下一行。
    • 如果A = B,则将两个数据集前进到下一行。
  • 重复比较并前进步骤,直到您在两个数据集上达到EOF。

完成后,您将获得A和B之间差异的完整列表,这将使转换A到B所需的步骤变得简单来计算。