Tôi có mã như dưới đây trong một dự án tôi đang làm việc.Dấu trang TDataset có hiệu lực trong bao lâu?
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;
Cá nhân, tôi không sử dụng bookmark nhiều - ngoại trừ để định vị một tập dữ liệu mà tôi chỉ di chuyển vị trí con trỏ (để tạo ra một danh sách, điền vào một danh sách chuỗi, vv). Nếu tôi Refresh
, cập nhật (đặc biệt khi bộ lọc có thể ẩn bản ghi), hãy nạp lại (Close
/Open
) hoặc bất kỳ thao tác nào sửa đổi dữ liệu trong tập dữ liệu, tôi không sử dụng dấu trang. Tôi thích Locate
trên khóa chính (sử dụng TClientDataset
, tất nhiên) hoặc yêu cầu sửa đổi các tham số.
Cho đến khi nào một dấu trang hợp lệ? Cho đến một số Refresh
? Cho đến khi một Close
/Open
được thực hiện để nạp lại dữ liệu? Khu an toàn kết thúc ở đâu?
Cân nhắc câu trả lời tôi đang sử dụng TClientDataset
với TSQLQuery
(DbExpress).
Sau một số thử nghiệm, ngay cả BookmarkValid cũng chứng minh bản thân nó không đáng tin cậy. Nó xảy ra khi bạn có một bộ lọc được kích hoạt trên tập dữ liệu - nó trả về true ngay cả khi bản ghi không phù hợp với điều kiện bộ lọc. Kết quả cuối cùng là việc ném một ngoại lệ. –