Как изменить вычисляемое поле с помощью TADODataSet?

У меня есть TADODataset выполняется с (только для примера):

SELECT id, name, lastname, name + ' ' + lastname as fullname
FROM persons
ORDER BY lastname

После того, как я открою набор данных, я могу изменить "name" а также "lastname" поля, но не может изменить"fullname"потому что это рассчитано.

Я пытаюсь открыть TADODataset в TClientDataset с помощью DataProvider, но это занимает слишком много времени (в исходном наборе данных около 100К записей):

SrcDS.FieldDefs.Update;
for i := 0 to Pred(SrcDS.FieldDefs.Count) do
  SrcDS.FieldDefs[i].CreateField(SrcDS).ReadOnly := false;
DestDS := TClientDataset.Create(nil);
DestDS.SetProvider(SrcDS);
DestDS.Open;
DestDS.SetProvider(nil);

В общем, я хочу иметь независимый набор данных с изменяемыми полями.
Как я могу изменить вычисляемые поля в наборе данных?

1 ответ

Вы должны рассчитать поле в Delphi. Создайте новое поле, щелкнув правой кнопкой мыши на компоненте TADODataset, выберите New Field, дать ему имя и установить его тип "рассчитывается".

В OnCalculateFields-Event просто напишите:

Procedure TMyDataModule.MyDatasetCalculate(Sender : TDataset);
Begin
  MyDataSetFullName.AsString := MyDatasetFirstName.AsString+' '+MyDataSetLastName.AsString;
End;

Обновление: Относительно вашей второй проблемы (100000 записей): если вы загрузите их в свой набор данных ADOD с помощью LockType = ltBatchOptimistic, это будет достаточно быстро и ничего не будет сохранено в базе данных, если вы не вызовете UpdateBatch Метод.

Если это все еще слишком медленно, попробуйте использовать функцию асинхронной загрузки (см. ExecuteOptions)

Другие вопросы по тегам