代码之家  ›  专栏  ›  技术社区  ›  Fabricio Araujo

TDataset书签保持有效多长时间?

  •  10
  • Fabricio Araujo  · 技术社区  · 16 年前

    在我正在工作的项目中,我有下面这样的代码。

    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 当然)或者修改参数。

    书签什么时候有效?直到一个 刷新 ?直到一个 关闭 / 正常开放 是否重新提取数据?安全区在哪里结束?

    在我使用的答案中考虑 Tclipse数据集 用一个 TSQLQuery (dBASECT)。

    3 回复  |  直到 6 年前
        1
  •  6
  •   Kromster Satyajit    6 年前

    像两者一样 c0rwin skamradt 已经提到:书签行为取决于您使用的TDataset子代。

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

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

    我知道1岁。2。可以使tclientdataset中的书签无效。我几乎可以肯定,对于tclientdataset,使用哪个底层提供程序(tsqlquery、tibquery等)并不重要。

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

    为了安全起见,随时打电话 BookmarkValid 在去书签之前。

        2
  •  4
  •   skamradt    16 年前

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

    我的理解是书签的实现取决于TDataset子代的供应商,并且在实现之间可能会有所不同。在我的简单数据集中( tBinData ,我实现了书签作为物理记录编号,这样只要记录没有被删除,它就会在刷新之间保持不变。我不能对所有实现都这么说。

        3
  •  2
  •   Jim McKeeth    16 年前

    TDataset实现虚拟书签方法。虽然这些方法确保如果调用了Bookmark方法,则从TDataset派生的任何DataSet对象都返回值,但返回值只是默认值,不跟踪当前位置。tdataset的后代(如tbedataset),重新实现bookmark方法以返回有意义的值,如下列表所述:

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

    从中得到 here