Как долго закладка TDataset остается действительной? - PullRequest
10 голосов
/ 11 мая 2009

У меня есть код, подобный приведенному ниже, в проекте, над которым я работаю.

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).

Ответы [ 3 ]

6 голосов
/ 12 мая 2009

Как и c0rwin и skamradt , уже упоминалось: поведение закладки зависит от используемого потомка TDataSet.

Как правило, закладки становятся недействительными во время:

  1. близко / открыть
  2. обновление (для наборов данных, которые его поддерживают)
  3. изменения данных (иногда только удаления)

Я знаю, что 1. и 2. могут сделать ваши закладки недействительными в TClientDataSets. Я почти уверен, что для TClientDataSets не имеет значения, какой базовый поставщик используется (TSQLQuery, TIBQuery и т. Д.).

Единственный способ убедиться, что работает, а что нет, это тестирование. Это означает, что вы совершенно правы в том, что не используете их: у закладок есть шансы быть ненадежными.

Чтобы быть в безопасности, всегда звоните BookmarkValid, прежде чем идти в закладки.

4 голосов
/ 12 мая 2009

Лично я редко использую закладки. Вместо этого я использую идентификатор просматриваемой записи и выполняю поиск по ней после завершения обновления. Если мне нужно перебрать все записи в наборе, я делаю это, используя клон tClientDataset (который получает свой собственный курсор).

Насколько я понимаю, реализация закладки зависит от поставщика потомка tDataset и может варьироваться в зависимости от реализации. В моем очень простом наборе данных ( tBinData ) я реализовал закладки как физический номер записи, чтобы он сохранялся между обновлениями до тех пор, пока запись не была удалена. Я не могу говорить это верно для всех реализаций.

2 голосов
/ 11 мая 2009

TDataSet реализует методы виртуальных закладок. Хотя эти методы гарантируют, что любой объект набора данных, полученный из TDataSet, возвращает значение, если вызывается метод закладки, возвращаемые значения являются просто значениями по умолчанию, которые не отслеживают текущее местоположение. Потомки TDataSet, такие как TBDEDataSet, переопределяют методы закладки, чтобы возвращать значимые значения, как описано в следующем списке:

  • BookmarkValid , для определения, используется ли указанная закладка.
  • Сравнить закладки , чтобы проверить две закладки и посмотреть, совпадают ли они.
  • GetBookmark , чтобы выделить закладку для вашей текущей позиции в наборе данных.
  • GotoBookmark , чтобы вернуться к закладке, ранее созданной GetBookmark
  • FreeBookmark , чтобы освободить закладку, ранее выделенную GetBookmark.

Получите это от здесь

...