我使用ADOConnection,ADOQuery,DataSource和DBGrid设置了从Delphi到pgsql的连接,以显示我的查询结果。 该数据库包含两列类型为 double 的值,包含数千行,我想将其插入到二维数组中。但是,由于我很新,我不知道如何插入将DBGrid的内容转换为数组。任何帮助非常感谢。
答案 0 :(得分:0)
首先,如果有数千行需要在读取之前将字段分配到变量中,以便在使用FieldByName时摆脱不必要的文本查找时间。
我手头没有德尔福,但这应该起作用,或者至少可以帮助你开始。
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;