【问题标题】:Delphi SQL return with multidimensional arrayDelphi SQL返回多维数组
【发布时间】:2017-12-04 20:40:57
【问题描述】:

我创建了一个类型

type
  TStringArray = array of array of string;

function TDataModule4.GetList(TableName: String): TStringArray;
var
  i : Integer;
begin
  i:= 0;
  with TFDQuery.Create(Nil) do
  begin
    Connection := ADConnectionMySQL;
    SQL.Add(Format('Select * from %s', [TableName]));
    Open;
    First;
    while not Eof do
    begin

    end;
    Free;
  end;
end;

我知道使用 FieldByName 获取数据,但我想返回多维数组中的所有数据。我该怎么做?

这是我想要返回的方式:

数组[0]["column1"] = "value1"

数组[0]["column2"] = "value2"

数组[1]["column1"] = "value3"

数组[1]["column2"] = "value4"

数组[2]["column1"] = "value5"

数组[2]["column2"] = "value6"

【问题讨论】:

  • 我不明白你在问什么。您已经声明了返回TStringArray 的函数,它再次声明为动态二维数组。使用SetLength() 给出数组长度和宽度,并在您的while 循环中填写值。查找动态数组的帮助和SetLength。如果这是问题所在,函数的结果有一个隐含的名称 Result
  • 您可能会得到问题的答案,但这里的整体方法很笨拙,大多数人可能会觉得您真正需要的是停下来思考一下您的架构。如果您只需要显示数据,那么使用数据感知组件可能会更容易。否则,如果您正在构建数据模型,那么您可能应该在模型部分多做一些工作——数据库行不是array of string,它是类型数据的记录。您的数据模型也应该以这种方式考虑它。

标签: arrays delphi multidimensional-array


【解决方案1】:

这是一种方法(虽然我不能这样做):

type
  TStringArray = array of array of string;
var
  Col: Integer;
  Row: Integer;
  Arr: TStringArray;
begin
  SetLength(Arr, FDQuery.Table.Rows.Count, FDQuery.Table.Columns.Count);

  for Row := 0 to FDQuery.Table.Rows.Count - 1 do
    for Col := 0 to FDQuery.Table.Columns.Count - 1 do
      Arr[Row][Col] := FDQuery.Table.Rows[Row].GetData(Col);
end;

【讨论】:

    【解决方案2】:

    我有一段时间没有使用 Delphi,也从未使用过 TFD-Query,但据我所知,这没有问题。我想把它写到评论中,但源代码在答案中可读性更好(未经测试)。 为了更好地理解,我引入了 Q 来表示您的查询名称,并引入了 A 来表示要填充数据的数组。

    //var
    A:TStringArray;
    actLine, actCol:integer;
    
    setlength(A,0);
    actLine := 0;
    
    while not Q.eof() do begin
    
      setlength(A,actLine + 1);
      setlength(A[actLine],FieldCount());
    
      for actCol := 0 to Q.FieldCount()-1 do
        A[actLine][actCol] := Q.Fields[actCol].AsString;
    
      inc(actLine);
      Q.Next;
    end;
    

    希望对你有帮助。

    当然:array of array 产生一个二维数组,列和行编号。只有内容是字符串。您描述的结构应该自己实现。

    【讨论】:

    • 什么? StringGrid?我没有看到问题中提到任何网格。这没有回答问题。
    • 一个,对不起。我改变这个。
    • 更好,但仍然是错误的。在第一次迭代中,在SetLengths 之后,数组中有多少行和多少列?在第二次迭代中,又是在SetLengths 之后?还要注意索引!
    • 如果主人总是只做出部分反应,作为导盲犬会很烦人。我仍然无法删除我的 dv。您需要多少个数组元素来存储数据,例如5个领域?呵呵!哇!呸呸呸!
    • 如果您纠正您发现的错误可能会更容易。有时结果比方式更重要......
    猜你喜欢
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    相关资源
    最近更新 更多