RSS
 

 

Как правильно обновить данные в TADODataSet?

30 Дек

Работая с ADO в Delphi, часто бывает необходимо обновить данные в TADODataSet. Стандартные методы не всегда дают нужный результат.
Как правильно обновить данные в TADODataSet?

Метод TADODataSet.Refresh не всегда отрабатывает верно. К тому же, бывает нужно обновить и другие записи кроме текущей. Для этого обычно вызывают последовательно методы Close и Open, так сказать пере открывают данные. Однако при этом теряется позиция указателя , локальная сортировка и т.п.
Ниже я приведен пример функции RefreshADODataSet из моей библиотеки полезных функций.

  • Функция полностью обновляет все записи в TADODataSet
  • При обновлении сохраняет и пытается восстановить позицию указателя текущей записи
  • По умолчанию при обновлении отключает связанные элементы управления (параметр isDisableControls)
  • По умолчанию при обновлении сохраняет и пытается восстановить режим фильтрации (параметр isSaveFilter)
  • По умолчанию при обновлении сохраняет и пытается восстановить режим сортировки (параметр isSaveOrder)

А вот и сам код процедуры:

unit ZFunctions;
 
interface
uses
 ... DB, ADODB, ...
 
procedure RefreshADODataSet(DS : TADODataSet;
	     isDisableControls : Boolean=True;
	     isSaveFilter      : Boolean=True;
             isSaveOrder       : Boolean=True);
 
implementation
...
procedure RefreshADODataSet(DS : TADODataSet;
	     isDisableControls : Boolean=True;
	     isSaveFilter      : Boolean=True;
             isSaveOrder       : Boolean=True);
var
  bm            : TBookmark;
  fFiltered     : Boolean;
  fFilter,fSort : string;
begin
  try
    if isSaveFilter then begin
      fFilter   :=  DS.Filter;
      fFiltered := DS.Filtered;
    end;
    if isSaveOrder then
      fSort := DS.Sort;
    bm := DS.GetBookmark;
    if isDisableControls then
      DS.DisableControls;
    DS.Close;
    DS.Open;
    try
      if isSaveFilter then begin
        DS.Filter   := fFilter;
        DS.Filtered := fFiltered;
      end;
      if isSaveOrder then
        DS.Sort := fSort;
    except
    end;
    try
      if (bm <> nil) AND (DS.BookmarkValid(bm)) then
        DS.GotoBookmark(bm);
    except
    end;
  finally
    try
      if bm <> nil then DS.FreeBookmark(bm);
    except
    end;
    if isDisableControls then
      DS.EnableControls;
  end;
end;
...

Подключив такой модуль к своему проекту и вызвав функцию RefreshADODataSet вы быстро и без проблем обновите данные с нужным вам результатом.

Я привожу здесь код отельной функции и вы можете включить ее в свой модуль библиотеку или подключить к любой форме.
Однако я рекомендую подобные функции объединить в отдельный unit, накапливать там полезные функции которые вы используете и подключать его(unit) как своим проектам.

Эта функция не претендует ни на оригинальность, ни на абсолютную верность. Просто приведена, как пример моей реализации часто необходимых действий при работе с базами данных. Возможно кому-то пригодится идея или даже сам код.

 
 

Метки: , 30.12.2010