将DBGrid数据插入到多维数组中

时间:2014-06-19 10:45:53

标签: arrays delphi dbgrid

我使用ADOConnection,ADOQuery,DataSource和DBGrid设置了从Delphi到pgsql的连接,以显示我的查询结果。 该数据库包含两列类型为 double 的值,包含数千行,我想将其插入到二维数组中。但是,由于我很新,我不知道如何插入将DBGrid的内容转换为数组。任何帮助非常感谢。

1 个答案:

答案 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;