从Delphi合并两个Firebird数据库



我使用的是Delphi Sydney版本,数据库是Firebird 2.5。我有两个数据库具有相同的结构,但它不是100%相同的数据。

我的策略是创建两个FDConnections和两个FDQueries,但是我不知道如何从一个表中获取数据并将其插入到另一个表中,而不需要为每个表创建TYPE和完整的结构并发送每个字段。数据源/FDTable吗?

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。我对逐表处理没有问题

有些表有17000个数据;我需要包含它们,而不需要重复数据,这个过程每天运行,直到系统迁移到另一个(我不知道什么时候)。

你可以添加一个标志来知道你已经移动了什么:

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;

最新更新