Database 在Delphi中不使用SQL比较表

Database 在Delphi中不使用SQL比较表,database,delphi,delphi-7,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

我在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;
程序TForm1.按钮3点击(发送方:TObject);
变量
s1,s2:字符串;
开始
表1.第一;
而不是(表1.Eof)做什么
开始
s1:=表1.FieldByName('Campo').AsString;
表2.第一;
而不是(表2.Eof)做什么
开始
s2:=表2.FieldByName('Campo').AsString;
如果(s1-s2)那么
开始
表2.追加;
表2.FieldByName('Campo')。关联:=
表1.FieldByName(‘Campo’).AsString;
终止
否则,如果(s1=s2),则
开始
表2.下表;
终止
表2.下表;
终止
表1.下表;
终止
终止

读取
表2的所有记录,并将
表2.FieldByName('Campo')中的值放入排序后的
TStringList
。然后遍历
Table1
的记录,并检查
stringList.IndexOf
中所有
Table1.FieldByName('Campo').AsString
。当
IndexOf
返回-1时,将记录追加到
表2
。切换
Table1
Table2
并重复操作。

您需要进行两次操作才能将丢失的数据从一个表复制到另一个表中。最简单的方法是创建一个过程来为您执行此操作,然后调用它两次:

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;

如果数据库不是非常大,那么这种方法可以很好地工作。如果是,您可以通过在要比较的字段上添加索引来提高性能。请参阅的Delphi帮助,其中包含更多信息和指向其他可能有用主题的链接。(链接到当前的Delphi帮助,但该信息在大多数情况下也适用于Delphi 7。)

如果您更具体地说明“未获得预期结果”部分,将非常有用。你得到的与你的期望有什么不同?我没有看到
表2。在代码中添加匹配的
表。使用此代码时会创建一些重复的字段。我应该把桌子放在哪里?我已经试过了,但是我遇到了一个错误。千万不要告诉你求助的人错误是什么。我们喜欢猜测。为什么你们需要两张相同的桌子?非常感谢你们的回答。但是有没有什么方法我不需要使用TStringList呢?没有
SQL
,没有
TStringList
-接下来要问的是没有代码怎么做。这是错误的解决方案。您有一个具有搜索功能的数据库-为什么要将数据移出数据库以执行数据库的设计任务?@KenWhite-您想进入索引并
定位
?-继续吧。
Locate
不需要索引,如果您不处理非常大的数据库,它可以正常工作。如果你有很多数据,你应该已经有了索引。无论哪种方式,从数据库移动到
TStringList
以与数据库中的值进行比较都是不必要的开销。无论哪种方式,您都可以对源数据进行一次传递;使用
TStringList
将所有内容都存储在内存中会产生额外的开销。这个答案就目前而言还行,但忽略了主键之类的小问题。如果表只有一个字段,那么这个解决方案就可以了,但在现实生活中,这只是一个部分解决方案(尽管它基于的问题也忽略了这些问题)。@No'amNewman:是的。这个问题并没有要求接受关于使用数据库的基础教育(这里的答案不在范围之内)。它问了一个具体的问题,关于如何让图解代码工作以获得两个匹配的数据副本。没有更多的信息,这是唯一可以提供的答案。如果海报在此之后有不同的要求,则应发布一个新问题来提出该问题。:-)如果你知道如何编写一个平衡线算法,就像我编写COBOL时一直做的那样,你不需要两次通过…:-)但您确实需要知道哪些字段被视为键。这些不需要是rDB术语中的键,它也可以在顺序数据集上工作。@Marjan:您还可以使用SQL更轻松地完成这项工作,这被排除在可能性之外。不过,您可以写一篇BLA来回答这个问题。:-)不,目前还没胃口喝一杯:-)(寒冷会抑制脑电波)。不过,我希望看到SQL解决方案的提示/链接。我已经有一段时间没有广泛使用SQL了,我需要阅读基本CRUD语句之外的内容。