TDataset书签有效期多长时间?

Fab*_*ujo 10 delphi tclientdataset dbexpress

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

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;
Run Code Online (Sandbox Code Playgroud)

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

书签何时有效?直到Refresh?直到Close/ Open完成重新获取数据?安全区在哪里结束?

考虑我使用的答案TClientDatasetTSQLQuery(dbExpress的).

Jer*_*ers 6

c0rwinskamradt一样已经提到过:书签行为取决于你使用的TDataSet后代.

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

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

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

唯一的方法是确保哪些有效,哪些无效.这意味着你完全没有使用它们:书签具有不可靠的内在机会.

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

  • 经过一些实验,即使BookmarkValid证明自己不可靠.当您在数据集上激活过滤器时会发生这种情况 - 即使记录与过滤条件不匹配,它也会返回true.最终结果是抛出异常. (5认同)

Art*_*ger 5

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

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

从这里获取


ska*_*adt 5

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

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