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

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, ,当然)或重新查询修改参数。

书签的有效期到什么时候?直到一个 Refresh?直到一个 Close/Open 是为了重新获取数据吗?安全区的尽头在哪里?

考虑我正在使用的答案 TClientDataset 与一个 TSQLQuery (DbExpress)。

有帮助吗?

解决方案

两个都喜欢 科文斯卡姆拉特 已经提到:书签行为取决于您使用的 TDataSet 后代。

一般来说,书签在以下期间失效:

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

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

确定什么有效、什么无效的唯一方法是对其进行测试。这意味着你不使用它们是完全正确的:书签本身就有可能不可靠。

为了安全起见,请随时致电 BookmarkValid 在转到书签之前。

其他提示

我个人很少会使用书签。我改用我查看记录的ID并执行就可以了,一旦找到刷新完成。如果我需要遍历所有的集合中的记录,我这样做,用的TClientdataSet的克隆(其都有自己的光标)。

我的理解是,书签的实施要由TDataSet的后代的供应商,并且可以实现之间变化。在我最简单的数据集( tBinData ),我实现书签的物理记录号码,以便它会只要记录并未被删除刷新之间依然存在。我不能代表所有的实现说话这个事实。

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

  • 书签有效, ,用于确定指定的书签是否正在使用。
  • 比较书签, ,测试两个书签,看看它们是否相同。
  • 获取书签, ,为您在数据集中的当前位置分配书签。
  • 转到书签, 返回到之前由 GetBookmark 创建的书签
  • 免费书签, ,释放以前由 GetBookmark 分配的书签。

从以下位置获取 这里

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top