无法对已关闭的数据集执行此操作:Firebird 2.5.2中的Delphi XE4错误

时间:2013-11-28 08:38:14

标签: delphi delphi-7 firebird delphi-xe4 firebird2.5

我在Delphi 7和Delphi XE4中都有以下代码。我正在将我的代码从Delphi 7迁移到Delphi XE4。我正在处理数据集。

我的数据集dsABC声明如下:

TfrmMainForm = class(TForm)
  dsABC: TpFIBDataSet;
  ......
  ......
end

dsABC在许多地方使用如下:

1. if (dsABC .Locate('ID', Id, [])) then   ---File 1
2. dsABC.Edit ----File 2

我的意思是说,无论它在哪里使用,它都会在Delphi XE4中抛出上述错误但在Delphi 7中工作正常。

但是如果我在使用数据集之前写下面的行,它可以正常工作

if not(dsABC.Active) then dsABC.Active := True;

我被迫在每个文件和Delphi XE4中的每个数据集中编写此行,但我不知道为什么它在Delphi 7中工作。我是正确的解决我的问题还是我需要一些默认设置在某个地方摆脱这个问题?

Delphi 7中的数据集默认是在Delphi XE4中是活动的还是非活动的,你必须在Delphi XE4中显式激活它?

我在stackoverflow上找到了关于这个问题的这些链接,但似乎没有任何与我的问题有关:

How do I solve the "Cannot perform this operation on a closed dataset" with Borland Database Engine and a Delphi application?

Cannot perform this operation on a closed dataset

3 个答案:

答案 0 :(得分:4)

鉴于您之前发布了连接到数据库的问题(这会导致任何数据集在设计时保持活动状态不活动),我会说这是问题的根源,并突出显示依赖于激活的数据集的问题这种方式在您的代码中。

答案 1 :(得分:3)

TpFibDatabase中有一些Designsupport属性:

DesignDBOptions - > ddoStoreConnected 也许这些是默认设置为delphi7而不是Xe4

答案 2 :(得分:0)

数据集越来越近了,因为我的事务超时设置为1000 i,e秒。这就是数据集每秒钟后关闭的原因。我将超时设置为零以解决这个问题。