无法在关闭的数据集上执行此操作:Firebird 2.5.2出现Delphi XE4错误

无法在关闭的数据集上执行此操作:Firebird 2.5.2出现Delphi XE4错误,delphi,delphi-7,firebird,delphi-xe4,firebird2.5,Delphi,Delphi 7,Firebird,Delphi Xe4,Firebird2.5,我在Delphi7和DelphiXe4中都有以下代码。我正在将我的代码从Delphi7迁移到DelphiXe4。我正在处理数据集 我的数据集dsABC声明如下: TfrmMainForm = class(TForm) dsABC: TpFIBDataSet; ...... ...... end dsABC在许多地方的使用方式如下: 1. if (dsABC .Locate('ID', Id, [])) then ---File 1 2. dsABC.Edit ----File

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

我的数据集dsABC声明如下:

TfrmMainForm = class(TForm)
  dsABC: TpFIBDataSet;
  ......
  ......
end
dsABC在许多地方的使用方式如下:

1. if (dsABC .Locate('ID', Id, [])) then   ---File 1
2. dsABC.Edit ----File 2
我的意思是,无论在哪里使用它,它都会在DelphiXe4中抛出上述错误,但在Delphi7中同样可以正常工作

但若我在使用dataset之前写下下面这行代码,它就可以正常工作了

if not(dsABC.Active) then dsABC.Active := True;
我被迫在Delphi XE4中的每个文件和每个数据集中写这一行,但我想知道为什么它在Delphi 7中工作。我解决问题的方法正确吗?还是我需要一些默认设置来解决这个问题


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

我在stackoverflow上找到了这些关于此问题的链接,但似乎与我的问题无关:


考虑到您之前发布了连接数据库的问题(这将导致任何数据集在设计时处于活动状态)我想说,这是问题的根源,并强调了在代码中依赖以这种方式激活的数据集的问题。

对于Designsupport,TpFibDatabase中有一些属性:


DesignDBOptions->ddoStoreConnected可能这些是为delphi7默认设置的,而不是在Xe4中设置的数据集正在接近,因为我的事务超时设置为1000 i,e 1秒。这就是为什么每隔一秒钟数据集就会关闭的原因。我将超时设置为零以解决此问题。

“Delphi 7中的数据集在Delphi XE4中默认处于活动状态,而在Delphi XE4中处于非活动状态”您是否尝试读取源代码?@MartynA-我已阅读源代码。默认情况下,它在源代码中是非活动的,并且在需要的地方被激活。@Andy_D的回答听起来很有道理。无论如何,我在这里发布之前应该做的事情包括:1)用代码显式打开数据集,2)为数据集的AfterClose事件设置事件处理程序并在其上设置断点。然后,如果有什么导致数据集在下次使用前关闭,则可以看到什么。数据集和连接对象上的
Active
属性永远不会发布。这是一种纯粹的邪恶,只有在设计时将其保持为True时才会导致问题。我永远不会建议,甚至无论如何也不会注意到您忘记在设计时将
Active
设置为True。@TLama我完全同意。但是,整个RAD项目在很大程度上是与VB竞争的营销项目。“看!我们也可以在设计时使用实时网格!”我个人不在我的应用程序中使用数据访问组件(我使用对象持久性框架)。这是有道理的。如果在打开表单时(例如,使用不存在的连接(或数据库中的某些内容已更改),EMBT实现了更智能的错误处理(例如,“忽略对表单上任何其他此类组件执行相同操作的所有其他尝试”选项),则这将是很好的.@TLama-Active属性在设计时任何地方都没有设置为Active。@nkp它们不会设置为Active,因为我已经在回答中发布了,失败的数据库连接将自动将任何连接的数据集的Active属性设置为False。