在没有SQL的情况下比较Delphi中的表

时间:2013-04-30 01:50:54

标签: database delphi delphi-7

在Delphi中使用Paradox数据库中的表时遇到问题。

我需要比较两个表并验证哪些字段相同,哪些字段不同。最后,两个表必须在字段上包含相同的值。

但是,一切都必须在不使用SQL的情况下完成,只有纯Delphi。

到目前为止,这是代码,但我没有得到预期的结果:

procedure TForm1.Button3Click(Sender: TObject); 
  var  
  s1,s2:string;  
begin  
  Table1.First;  
  while not (Table1.Eof) do  
  Begin 
      s1 := Table1.FieldByName('Campo').AsString; 
      Table2.First; 
      while not (Table2.Eof) do 
      Begin 
          s2 := Table2.FieldByName('Campo').AsString; 

          if (s1 <> s2) then 
          begin 
            Table2.Append; 
            Table2.FieldByName('Campo').AsString := 
                Table1.FieldByName('Campo').AsString; 
          end 
          else if (s1 = s2) then 
          begin 
            Table2.Next; 
          end; 

          Table2.Next; 
      End; 
      Table1.Next;  
  End;
End;

2 个答案:

答案 0 :(得分:0)

您需要进行两次传递才能将缺失的数据从一个表复制到另一个表中。最简单的方法是创建一个程序来为您完成,然后调用它两次:

procedure TForm1.CopyData(const Src, Dest: TTable);
var
  CompareVal: string;
begin
  Src.First;
  while not Src.Eof do
  begin
    CompareVal := Src.FieldByName('Campo').AsString;
    if not Dest.Locate('Campo', CompareVal, []) then
    begin
      Dest.Insert;     // Or Dest.Append;
      Dest.FieldByName('Campo').AsString := CopmareVale;
      Dest.Post;
    end;
    Src.Next;
  end;
end;

这样称呼:

procedure TForm1.Button3Click(Sender: TObject);
begin
  CopyData(Table1, Table2);
  CopyData(Table2, Table1);
end;

如果数据库不是很大,这可以正常工作。如果是,则可以通过在要比较的字段上添加索引来提高性能。请参阅TDataSet.Locate的Delphi帮助,其中包含更多信息和一些可能有用的其他主题的链接。 (链接是当前的Delphi帮助,但这些信息在大多数情况下也适用于Delphi 7.)

答案 1 :(得分:-1)

仔细阅读Table2的所有记录,并将Table2.FieldByName('Campo').AsString值放入已排序的TStringList中。然后遍历Table1的记录,并检查所有stringList.IndexOf的{​​{1}}。当Table1.FieldByName('Campo').AsString返回-1时,将记录追加到IndexOf。切换Table2Table1并重复。