При работе с ADO компонентами часто возникает необходимость копирования данных из Recordset в структуры, которые в дальнейшем используются в программе. Такими структурами могут быть объекты определенного класса, массивы записей, всякого рода списки и т.п.
О том как скопировать данные с наименьшими затратами я опишу далее.
Обертка для ADO компонент Delphi описывает класс TCustomADODataSet от которого наследуются TADODataSet, TADOTable, TADOQuery и TADOStoredProc. В данном классе есть ссылка на ADO интерфейс Recordset (набор данных).
Типичный способ загрузки данных из ADO компонент сводится к циклу:
Чтобы избавиться от такого цикла можно использовать функцию GetRows у интерфейса Recordset. Для примера покажу загрузку списка идентификаторов и названий в TStrings:
//функция копирования
О том как скопировать данные с наименьшими затратами я опишу далее.
Обертка для ADO компонент Delphi описывает класс TCustomADODataSet от которого наследуются TADODataSet, TADOTable, TADOQuery и TADOStoredProc. В данном классе есть ссылка на ADO интерфейс Recordset (набор данных).
Типичный способ загрузки данных из ADO компонент сводится к циклу:
while not Eof do begin //обработка записи из набора данных Next; end;Данный цикл является причиной увеличения времени обработки.
Чтобы избавиться от такого цикла можно использовать функцию GetRows у интерфейса Recordset. Для примера покажу загрузку списка идентификаторов и названий в TStrings:
//функция копирования
function ADOIdNameToStrings(ds: TCustomADODataSet): TStrings;
//вспомогательные структуры
type
TRec = record
id: TVarData;
Name: TVarData;
end;
TRecArray = array[0..0] of TRec;
PRec = ^TRecArray;
var
i: Integer;
PlainData: Variant;
vcData: PRec;
begin
Result := TStringList.Create;
TStringList(Result).Duplicates := dupAccept;
PlainData := ds.Recordset.GetRows(Integer(adGetRowsRest), adBookmarkFirst, VarArrayOf([0, 1]));
Result.BeginUpdate;
Result.Capacity := VarArrayHighBound(PlainData, 2);//выделяем память под все записи
vcData := VarArrayLock(PlainData);//получаем указатель на массив из пар Variant
try
for i := Result.Capacity downto 0 do
with vcData^[i] do
Result.AddObject(Name.VOleStr, TObject(id.VInteger));
//TStringList(Result).Sorted := True;//при необходимости можно отсортировать
finally
VarArrayUnlock(PlainData);
Result.EndUpdate;
end;
end;
Комментариев нет:
Отправить комментарий