我已经使用 ADOConnection、ADOQuery、DataSource 和 DBGrid 设置了从 Delphi 到 pgsql 的连接,以显示我的查询结果。 数据库包含 2 列 double 类型的值,有几千行,我想将其插入到二维数组中。但是,由于很新,我不确定如何插入将 DBGrid 的内容放入数组中。非常感谢任何帮助。
最佳答案
首先,如果有数千行,您需要在读取之前将字段分配给变量,以便在使用 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 不一定包含所有记录的数量,上面的原始解决方案可以解决这个问题。我对其进行了更正,因此它不会一次增长超过 16k 个项目,并且开销最多为 16k - 1 个数组条目。有关 TDataSet“延迟加载”的信息,请参阅 DBGrid with read ahead capability using 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;
关于arrays - 向多维数组中插入DBGrid数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24304724/