我的代码执行以下操作:
TFDConnection
TFDConnection
TT_SYS_WEEKS
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]unsuccesful metadata update Table TT_SYS_WEEKS already exists
失败。
在步骤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
可以发生什么? 还有什么我可以研究的吗?
其他背景资料:
答案 0 :(得分:0)
您需要在第4步,第5步和第6步(当然是 - 7)之后执行提交。 Firebird中的一些DDL只是在提交时才真正执行,所以如果你在一个事务中运行所有东西,你仍然没有在步骤3和4中实际删除并重新创建索引,步骤6中的表格丢弃可能是在步骤5中被先前的DML阻止,并且当您尝试在步骤7中重新创建它时,步骤6中的表删除仍未执行。