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完成重新获取数据?安全区在哪里结束?
考虑我使用的答案TClientDataset用TSQLQuery(dbExpress的).
像c0rwin和skamradt一样已经提到过:书签行为取决于你使用的TDataSet后代.
通常,书签在以下期间无效:
我知道1.和2.可以使TClientDataSets中的书签无效.我几乎可以肯定,对于TClientDataSets,使用哪个底层提供程序(TSQLQuery,TIBQuery等)并不重要.
唯一的方法是确保哪些有效,哪些无效.这意味着你完全没有使用它们:书签具有不可靠的内在机会.
为了安全起见,请BookmarkValid在转到书签前随时致电.
TDataSet 实现虚拟书签方法。虽然这些方法确保从 TDataSet 派生的任何数据集对象在调用书签方法时返回一个值,但返回值仅仅是默认值,不会跟踪当前位置。TDataSet 的后代(例如 TBDEDataSet)重新实现书签方法以返回有意义的值,如下列表中所述:
从这里获取