Состояние записи
Класс TCustomADODataSet обладает дополнительными возможностями, которые позволяют отслеживать состояние каждой записи.
Для текущей записи набора данных можно определить ее состояние. Для этого предназначено свойство:
TRecordStatus = (rsOK, rsNew, rsModified, rsDeleted, rsUnmodified, rslnvalid, rsMultipleChanges, rsPendingChanges, rsCanceled, rsCantRelease, rsConcurrencyViolation, rsIntegrityViolation, rsMaxChangesExceeded, rsObjectOpen, rsOutOfMemory, rsPermissionDenied, rsSchemaViolation, rsDBDeleted); property RecordStatus: TRecordStatusSet;
Где:
- rsOK – запись успешно сохранена;
- rsNew – запись добавлена;
- rsModified – запись была изменена;
- rsDeleted – запись удалена;
- rsUnmodified – запись без изменений;
- rslnvalid – запись не может быть сохранена из-за неверной закладки;
- rsMultipleChanges – запись не может быть сохранена из-за множественных изменений;
- rsPendingChanges – запись не может быть сохранена из-за ссылки на несохраненные изменения;
- rsCanceled – операция с записью была отменена;
- rsCantRelease – запись заблокирована;
- rsConcurrencyViolation – запись не может быть сохранена из-за типа блокировки;
- rsintegrityvioiation – нарушена ссылочная целостность;
- rsMaxChangesExceeded – слишком много изменений;
- rsObjectOpen – конфликт с объектом базы данных;
- rsoutofMemory – недостаток памяти;
- rsPermissionDenied – нет доступа;
- rsSchemaViolation – нарушение структуры данных;
- rsDBDeleted – запись удалена в БД.
Как видите, благодаря этому свойству состояние отдельной записи может быть определено очень точно.
Кроме этого, метод:
type TUpdateStatus = (usUnmodified, usModifled, uslnserted, usDeleted); function UpdateStatus: TUpdateStatus; override;
…возвращает информацию о состоянии текущей записи.
Соответственно до и после изменения записи вызываются методы-обработчики:
TWillChangeRecordEvent = procedure(DataSet: TCustomADODataSet; const Reason: TEventReason; const RecordCount: Integer; var EventStatus: TEventStatus) of object; property OnWillChangeRecord: TWillChangeRecordEvent;
…и:
TRecordChangeCompleteEvent = procedure(DataSet: TCustomADODataSet; const Reason: TEventReason; const RecordCount: Integer; const Error: Error; var EventStatus: TEventStatus) of object; property OnRecordChangeComplete: TrecordChangeCompleteEvent;
Где параметр Reason позволяет узнать, какой метод изменил записи, а параметр RecordCount возвращает число измененных записей.