2016-07-21 8 views
2

У меня есть простой набор данных со следующей структурой:TBlobField.OldValue всегда показывают нуль в BeforeUpdateRecord и AfterUpdateRecord случае

Server.FieldDefs.Add('Code', ftString, 5); 
Server.FieldDefs.Add('Memo', ftMemo, 0); 
Server.FieldDefs.Add('Blob', ftBlob, 0); 

The Dataset имеет одну запись. Затем я извлекаю набор данных через TDataSetProvider в экземпляре TClientDataSet, внося изменения в данные и ApplyUpdate. Он должен инициировать событие BeforeUpdateRecord и AfterUpdateRecord для TDataSetProvider.

Однако OldValue поле ftBlob всегда показывают Null но ftMemo и поле ftString показывает не Null:

OnBeforeUpdateRecord 
Code.OldValue is not null 
Code.NewValue is not null 
Memo.OldValue is not null 
Memo.NewValue is not null 
Blob.OldValue is null 
Blob.NewValue is not null 

OnAfterUpdateRecord 
Code.OldValue is not null 
Code.NewValue is not null 
Memo.OldValue is not null 
Memo.NewValue is not null 
Blob.OldValue is null 
Blob.NewValue is not null 

Хотя поле ftMemo не возвращает правильный результат тоже. Поле OldValue ftMemo всегда является пустой строкой.

Я сообщил об этом проблеме RSP-15519. Из этого также может загрузиться образец проекта.

Просто интересно, если это дизайн Мидаса? Или это ошибка?

+0

Какова была ценность поля «Blob» в таблице перед записью? Держу пари, что это было нулевым. Кроме того, вы должны показать нам код Delphi, а не ваш псевдокод. Вы заставляете нас угадывать. – nolaspeaker

+0

посмотреть, будет ли настройка dspropINCLBLOBSINDELTA делать трюк – vavan

ответ

0

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

function BlobIsModified(CDS: TClientDataSet; BlobFieldName: string): Boolean; 
begin 
    Exit((CDS.Fields.FieldByName(BlobFieldName) as TBlobField).Modified); 
end; 

Мы используем только это, когда CDS.Fields.FieldByName(field_name).IsBlob возвращает значение ИСТИНА, и CDS.Fields.FieldByName(field_name).DataType не в [ftString, ftWideMemo, ftWideString], так как эти типы строк могут быть классифицируются как blobs (в зависимости от их размера), и в этом случае вы должны использовать OldValue, NewValue и проверить на NULL, чтобы определить, произошло ли изменение.

 Смежные вопросы

  • Нет связанных вопросов^_^