在Delphi中打开和关闭数据集

6
假设我有一个数据集,例如Delphi应用程序中的dsSample。要读取或写入数据集中的数据,必须打开数据集。我只是想知道以下语句之间有什么区别:
dsSample.Open;
dsSample.Active := True;

and 

dsSample.Close;
dsSample.Active := False;

如果“Open”和“Active”执行相同的操作,为什么在Delphi中打开和关闭数据集需要两个不同的关键字?

8
如果没有“Active”属性,您将无法在设计时打开数据集,因为您无法将方法发布到对象检查器中。这是我的观点。 - TLama
@TLama - 那么,这是否意味着Open用于在运行时打开数据集,而Active用于设计时? - user1556433
2
我在代码中都见过它们。我只是认为Active是后来开发的,用于设计时控制。个人而言,我使用它,因为如果你在代码中找到一行说OpenClose的话,比评估分配给Active属性的内容更易读。但这只是品味问题... - TLama
1
@负面投票者 - 这个问题有什么问题吗? - user1556433
1
使用 Active 也可以读取状态。个人而言,我更喜欢使用 OpenClose,因为我认为作为命令时更清晰,而不是将 Active 设置为 False。但就像 TLama 说的那样:这是一个品味问题,所以也许这就是问题所在:它主要基于个人意见,除非我们找到编写实际代码的人。 - GolezTrol
2个回答

6

使用任何一种方法都可以,因为它们之间几乎没有区别,DataSet.Open 方法只有一行代码:Active := True。属性 Active 会调用 SetActiveGetActive。如果您按住 CTRL 并单击 OpenActive,阅读 VCL 源代码中的代码将会相对容易地了解这些内容,了解一些 VCL 的内部机制将有助于您避免出现以下情况:

if not DataSet.Active then
  DataSet.Open;

与其仅仅

DataSet.Open;

正如 TLama 指出的那样,Active 是一项已发布的属性,可供 Delphi IDE 使用,使您可以在设计时切换它来为表单或数据模块上的数据集进行操作。Open 和 Close 可能并非绝对必需,但在许多语言中是一个相当普遍的模式。


1
值得一提的是:Active可以用来确定数据集是否已打开。显然,它不应该像您提供的示例那样使用。但在执行其他操作之前,您可能希望确认数据集是否处于活动状态,这可能是其他原因。 - Disillusioned

1

TDataset.Open 是一个 过程,因此您无法确定数据集是否已填充数据。

procedure TDataSet.Open;
begin
  Active := True;
end;

Active是一个属性

使用Active来确定或设置数据集是否填充了数据。当Active为false时,数据集关闭;数据集不能读取或写入数据,数据感知控件也无法使用它来获取数据或发布编辑。当Active为true时,数据集可以填充数据。它可以从数据库或其他来源(如提供程序)读取数据。根据CanModify属性的设置,活动数据集可以发布更改。 将Active设置为true:

  1. 生成BeforeOpen事件。
  2. 将数据集状态设置为dsBrowse。
  3. 建立获取数据的方式(通常是通过打开游标)。
  4. 生成AfterOpen事件。

如果在打开数据集时发生错误,则数据集状态将设置为dsInactive,并关闭任何游标。 将Active设置为false:

  1. 触发BeforeClose事件。
  2. 将State属性设置为dsInactive。
  3. 关闭游标。
  4. 触发AfterClose事件。

应用程序必须在更改影响应用程序中显示数据的控件或数据库状态的其他属性之前将Active设置为false。

注意:调用Open方法会将Active设置为true;调用Close方法会将Active设置为false。

1
我认为OP知道这些东西是如何工作的。这个问题更多地涉及到为什么有这两种打开和关闭数据集的方式。 - TLama
我在第一行解释了TDataset.Open是一个过程,因此您无法得知数据集是否已填充数据,但Active是一个属性... - Sayat Ertüfenk
1
除了读取“Active”属性之外,它对数据集是否填充有数据一无所知。数据集可能处于活动状态,但记录数为0。 - Disillusioned

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接