从 Delphi 中合并两个Firebird数据库

fbcarpbf  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(172)

我使用的是 Delphi 悉尼版,数据库是Firebird 2.5。我有两个结构相同的数据库,但不是100%相同的数据。
我的策略是创建两个FDConnection和两个FDQueries,但我不知道如何从一个表中获取数据并将其插入到另一个表中,而不为每个表创建一个TYPE和完整的结构并发送每个字段。

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  DM_Data.FDQryDatabase.Close;
  DM_Data.FDQryDatabase.SQL.Clear;
  DM_Data.FDQryDatabase.SQL.Add('SELECT * FROM DOCUMENTI_FAMIGLIA');
  DM_Data.FDQryDatabase.Open;
  while not(DM_Data.FDQryDatabase.Eof) do
  begin
    Memo1.Lines.Add(DM_Data.FDQryDatabase.FieldValues['FDOC_IDFAMIGLIA']);
    DM_Data.FDQryDatabase.Next;
  end;
  Memo1.Lines.Add('--------------------');
  DM_Data.FDQuerySource.Close;
  DM_Data.FDQuerySource.SQL.Clear;
  DM_Data.FDQuerySource.SQL.Add('SELECT * FROM DOCUMENTI_FAMIGLIA');
  DM_Data.FDQuerySource.Open;
  while not(DM_Data.FDQuerySource.Eof) do
  begin
    Memo1.Lines.Add(DM_Data.FDQuerySource.FieldValues['FDOC_IDFAMIGLIA']);
    // Insert
    DM_Data.FDQuerySource.Next;
  end;
end;

我想知道如何使用 Delphi 对象从一个数据库迁移到另一个数据库,这是一个更短的解决方案。FDQryDatabase将是主数据库,FDQuerySource将被添加到FDQryDatabase。我没有问题,做表的表。
有些表有1.7万个数据;我将需要包括他们没有重复的数据,这个过程每天运行,直到系统迁移到另一个(我不知道什么时候)。

h9a6wy2h

h9a6wy2h1#

您可以添加一个标志以了解您已经移动的内容:

procedure TForm1.Button1Click(Sender: TObject);
var
  LList: TList<string>;
  i: integer;
begin
  LList := TList<string>.Create;

  try
    FDQryDatabase.Close;
    FDQryDatabase.SQL.Clear;
    FDQryDatabase.SQL.Add('SELECT * FROM DOCUMENTI_FAMIGLIA');
    FDQryDatabase.Open;
    while not FDQryDatabase.Eof do
    begin
      LList.Add(FDQryDatabase.FieldValues['FDOC_IDFAMIGLIA']);
      FDQryDatabase.Next;
    end;

    FDQuerySource.SQL.Clear;
    for i := 0 to LList.Count - 1 do
    begin
      if i mod 500 = 0 then
      begin
        FDQuerySource.ExecSQL;
        FDQuerySource.SQL.Clear;
      end;

      FDQuerySource.SQL.Add('INSERT INTO DOCUMENTI_FAMIGLIA (FDOC_IDFAMIGLIA)');
      FDQuerySource.SQL.Add(' SELECT ' + LList.Items[i]);
      FDQuerySource.SQL.Add(' FROM DOCUMENTI_FAMIGLIA');
      FDQuerySource.SQL.Add(' WHERE NOT EXISTS (SELECT 1 FROM DOCUMENTI_FAMIGLIA df WHERE df.FDOC_IDFAMIGLIA = ' +  LList.Items[i] + ');');
    end;

    if FDQuerySource.SQL.Count > 0 then
      FDQuerySource.ExecSQL;
  finally
    FDQryDatabase.Close;
    FreeAndNil(LList);
  end;
end;

相关问题