13

我正在工作的项目中有如下代码。

procedure TForm.EditBtnClick(Sender:TObject);
begin
  // Mark is form variable. It's private
  Mark = cdsMain.GetBookmark;
  // blabalbal
  .
  .   
  .
end;

procedure TForm.OkBtnClick(Sender:TObject);
var  
  mistakes: Integer;
begin
  //Validation stuff and transaction control
  //removed to not clutter the code
  If cdsMain.ChangeCount <> 0 then 
    mistakes := cdsMain.AppyUpdates(-1); 
  cdsMain.Refresh;
  try
    cdsMain.GotoBookmark(Mark);
    // Yes, I know I would have to call FreeBookmark
    // but I'm just reproducing 
  except
    cdsMain.First;
  end;
end;

就个人而言,我很少使用书签——除了重新定位我只移动光标位置的数据集(创建列表、填充字符串列表等)。如果我Refresh、更新(特别是当过滤器可以使记录不可见时)、重新获取(Close/ Open)或任何修改数据集中数据的操作,我不使用书签。我更喜欢Locate在主键上(TClientDataset当然使用 a )或重新查询修改参数。

书签的有效期到什么时候?直到一个Refresh?直到Close/Open完成重新获取数据?安全区在哪里结束?

考虑一下我TClientDatasetTSQLQuery(DbExpress)一起使用的答案。

4

3 回答 3

7

就像c0rwinskamradt已经提到的那样:书签行为取决于您使用的 TDataSet 后代。

通常,书签在以下期间无效:

  1. 关闭/打开
  2. 刷新(在支持它的数据集上)
  3. 数据更改(有时仅删除)

我知道 1. 和 2. 会使您在 TClientDataSets 中的书签无效。我几乎可以肯定,对于 TClientDataSets,使用哪个底层提供程序(TSQLQuery、TIBQuery 等)并不重要。

确定什么有效,什么无效的唯一方法是对其进行测试。这意味着你不使用它们是完全正确的:书签有一个内在的机会是不可靠的。

为了安全起见,请务必BookmarkValid在前往书签之前致电。

于 2009-05-11T23:15:46.593 回答
4

TDataSet 实现了虚拟书签方法。虽然这些方法确保在调用书签方法时从 TDataSet 派生的任何数据集对象都返回一个值,但返回值只是默认值,不跟踪当前位置。TDataSet 的后代,例如 TBDEDataSet,重新实现了书签方法以返回有意义的值,如下表所述:

  • BookmarkValid,用于确定是否正在使用指定的书签。
  • CompareBookmarks,测试两个书签是否相同。
  • GetBookmark,为您在数据集中的当前位置分配书签。
  • GotoBookmark,返回到以前由 GetBookmark 创建的书签
  • FreeBookmark,释放以前由 GetBookmark 分配的书签。

这里获取

于 2009-05-11T19:23:27.237 回答
4

我个人很少使用书签。相反,我使用正在查看的记录的 ID,并在刷新完成后对其执行定位。如果我需要遍历集合中的所有记录,我会使用 tClientDataset 的克隆(它有自己的游标)来完成。

我的理解是,书签的实现取决于 tDataset 后代的供应商,并且可能因实现而异。在我非常简单的数据集 ( tBinData ) 中,我将书签实现为物理记录编号,因此只要记录未被删除,它就会在刷新之间持续存在。我不能对所有实现都这么说。

于 2009-05-11T20:29:57.753 回答