gpt4 book ai didi

delphi - 使用嵌入式 Firebird 时删除表失败并显示 'unsuccessful metadata update'

转载 作者:行者123 更新时间:2023-12-03 18:44:41 28 4
gpt4 key购买 nike

我的代码执行以下操作:

  1. 设置设计时目标 TFDConnection
  2. 创建运行时源 TFDConnection
  3. 删除目标中的所有索引和表
  4. 重现那些
  5. 将所有数据从源复制到目标
  6. 删除其中一个名为 TT_SYS_WEEKS 的表(和索引)
  7. 重新创建并填充

TFDConnections 可以嵌入或不嵌入 Firebird。这适用于所有组合除了,当两者都被嵌入时。

第6步,执行后

DROP INDEX <OWNER>TT_I1_SYS_WEEKS
ALTER TABLE <OWNER>TT_SYS_WEEKS DROP CONSTRAINT TT_I0_SYS_WEEKS

声明

DROP TABLE TT_SYS_WEEKS

[FireDAC][FB][Phys]失败元数据更新表 TT_SYS_WEEKS 已存在

删除和创建表/索引的完全相同的操作已在步骤 3、4、5 中执行。 TT_SYS_WEEKS 不是最后复制的表。

设计时目标连接及其TFDPhysFBDriverLink设置如下:

AConnection.TxOptions.AutoCommit := true;
AFDPhysDriverLink.DriverID := 'FBEmbeddedBase'; // JD 28-3-2018
AFDPhysDriverLink.VendorLib := 'fbembed.dll'; // 32-bits only
AConnection.Params.DriverID := 'FBEmbeddedBase'; // AConnection
AConnection.Params.Database := 'full GDB file';
SetFireBirdMapRules(AConnection); // Some mapping rules
AConnection.UpdateOptions.LockWait := False;
AConnection.UpdateOptions.LockMode := lmNone;

运行时源连接和TFDPhysFBDriverLink设置如下:

// Create 'own' TFDPhysFBDriverLink for embedded connection
// https://stackoverflow.com/questions/46691699/setting-up-a-second-tfdphysfbdriverlink-possible-and-necessary
lDriverLink := TFDPhysFBDriverLink.Create(Application);
lDriverLink.DriverID := 'FBEmbedded';
lDriverLink.VendorLib := 'fbembed.dll'; // 32-bits embedded
LRestoreDB := TFDConnection.Create(Application);
LRestoreDB.UpdateOptions.RequestLive := false;
LRestoreDB.ResourceOptions.AutoReconnect := true;
LRestoreDB.Params.DriverID := lDriverLink.DriverID;
with LRestoreDB do
begin
Params.Database := AFBFileName;
Params.UserName := '***';
Params.Password := '***';
LoginPrompt := False;
// ResourceOptions.KeepConnection is default true
FetchOptions.Mode := fmAll;
end;
SetFireBirdMapRules(LRestoreDB); // Some mapping rules

会发生什么
还有什么我可以调查的吗?

其他背景信息:

  • 使用参数化的INSERT 查询将许多表的数据复制到目标数据库。每个表传输都有一个显式提交的事务。
  • 在表复制操作中TxOptions.AutoCommit对目标数据库为真
  • Delphi Tokyo 10.2.3 Win32 应用,Firebird 2.5.3.25778 Win32
  • This user DROP 之后的 CREATE 有问题。在answer , Mark写入 使用 execute 语句会添加额外的锁 iirc,这会与相同表名的后续 DDL 发生冲突。那是Firebird 2.1下的PSQL,没有提到嵌入式,我也没有死锁错误。

最佳答案

您需要在第 4 步、第 5 步和第 6 步(当然还有第 7 步)之后执行提交。 Firebird 中的某些 DDL 仅在提交时才真正执行,因此如果您在一个事务中运行所有内容,您将不会在步骤 3 和 4 中实际删除并重新创建索引,步骤 6 中的表删除可能会被阻止第 5 步中较早的 DML,当您尝试在第 7 步中重新创建它时,第 6 步中的表删除将尚未执行。

关于delphi - 使用嵌入式 Firebird 时删除表失败并显示 'unsuccessful metadata update',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49531871/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com