Я установил соединение из Delphi в pgsql, используя ADOConnection, ADOQuery, DataSource и DBGrid, чтобы представить результаты моего запроса. База данных содержит 2 столбца значений типа double из нескольких тысяч строк, которые я хотел бы вставить в двумерный массив. Однако, поскольку я совершенно новый, я не знаю, как вставить содержимое DBGrid в массив. Любая помощь очень ценится.
Вставьте данные DBGrid в многомерный массив
Ответы (1)
Прежде всего, если есть тысячи строк, вам нужно назначить поля переменным перед чтением, чтобы избавиться от ненужного времени поиска текста при использовании FieldByName.
У меня нет под рукой Delphi, но это должно сработать или, по крайней мере, помочь вам начать работу.
uses Math;
procedure ProcessArray(ADataSet: TDataSet);
var
field1: TField;
field2: TField;
len: Integer;
a: array of array[2] of double;
begin
len := 0;
SetLength(a, 0);
field1 := ADataSet.FieldByName('field1');
field2 := ADataSet.FieldByName('field2');
ADataSet.First;
while not ADataSet.Eof do
begin
Inc(len);
if len > Length(a) then
SetLength(a, len + Min(len, 16384));
a[len - 1][0] := field1.Value;
a[len - 1][1] := field2.Value;
ADataSet.Next;
end;
SetLength(a, len);
// Process the results in the a array
end;
AlexSC предлагает использовать свойство TADODataSet.RecordCount для первоначальной установки размера массива. Обратите внимание, что если TDataSet загружается из базы данных не полностью (например, использует серверный курсор), RecordCount не обязательно будет содержать количество всех записей, и оригинальное решение, приведенное выше, сможет справиться с этим. Я внес в него поправку, чтобы он не увеличивал более 16 000 элементов одновременно, а накладные расходы составляли не более 16 000 – 1 элементов массива. Для получения информации о «ленивой загрузке» TDataSet см. DBGrid с возможностью упреждающего чтения с использованием ADO< /а>
Пожалуйста, найдите код, используя RecordCount ниже:
procedure ProcessArray(ADataSet: TDataSet);
var
field1: TField;
field2: TField;
len: Integer;
a: array of array[2] of double;
begin
len := 0;
SetLength(a, ADataSet.RecordCount);
field1 := ADataSet.FieldByName('field1');
field2 := ADataSet.FieldByName('field2');
ADataSet.First;
while not ADataSet.Eof do
begin
a[len][0] := field1.Value;
a[len][1] := field2.Value;
Inc(len);
ADataSet.Next;
end;
// Process the results in the a array here
end;
TADOQuery
, поэтому мы можем использовать его свойство RecordCount
) в качестве параметра и установил размер массива только один раз.
- person AlexSC; 24.06.2014
Double
хранить в массиве? Вместо того, чтобы смотреть наDBGrid
, вам лучше посмотреть на свойствоADOQuery.FieldByName('Field1').AsDouble
и использовать его для заполнения вашего массива. - person Andy_D   schedule 19.06.2014SUM
в SQL; вы можете использовать вычисляемые/агрегированные поля в подчиненном TDataSet; и так далее... - person kobik   schedule 24.06.2014