Как изменить вычисляемое поле с помощью 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
)