postgresql - 在 Delphi 上使用 FireDAC 从 sql 表中获取文本 [] 值

标签 postgresql delphi firedac

在 pgAdmin 上,使用简单查询“select * from data”,我只得到一条包含字段类型 text[] 且值为“{"1","2","3"}' 的记录。 以下简化代码仅返回值的“1”部分:

function GetData: string;
var
  q: TFDQuery;
  s: string;
  i: integer;
  av: array of variant;
  as: array of string;
begin
  result:='';
  q:=TFDQuery.Create(nil);
  try
    q.Connection:=FDConnection;
    q.SQL.Text:='select * from data';
    try
        q.Open;
        while not q.Eof do
        begin
            //s:=q.FieldByName('data_array').AsString;      //s = '1'
            //as:=q.FieldByName('data_array').AsVariant;    //as length = 1; as[0] = '1'        
            av:=q.FieldByName('data_array').AsVariant;
            for i:=0 to Length(av)-1 do s:=s+av[i];         //av length = 1; s = '1'        
            q.Next;
        end;
        result:=q.RecordCount;
    except
        result:=-2;
    end;
    finally
        q.Free;
        sl.Free;
    end;
end;

获取全部数据的方法是什么?

最佳答案

虽然Embarcadero documentation说你应该使用 TArrayField 转换(它适用于 Interbase):

procedure TFrmMain.Button1Click(Sender: TObject);
var
F: TArrayField;
V: Variant;
begin
F := TArrayField(q.FieldByName('data_array'));
V := F.FieldValues[0];
ShowMessage(VarToStr(V));
end;

对于 PostgreSQL,它似乎无法正常工作(至少对于 C++ 构建器 XE6,我只得到第一个数组项)。 Firedac 将 PostgreSQL 数组字段作为嵌套数据集处理,因此如果以上方法对您也不起作用, 在 C++ 中,您可以将 PG 数组用作普通数据集,通过移动光标访问项目,例如:

TDataSetField * TT = (TDataSetField*)q->FieldByName("data_array");
TT->NestedDataSet->RecNo=2; // or while(!q->NestedDataSet->eof) etc.
ShowMessage(TT->NestedDataSet->Fields->Fields[0]->AsString);

在您的案例中,翻译成 delphi 的内容看起来像(可能拼写错误):

...
var
TT: TDataSetField;
...
begin
TT:= TDataSetField(q.FieldByName('data_array'));
    while not TT.NestedDataSet.Eof do
    begin
        s:= s+ TT.NestedDataSet.Fields.Fields[0].AsString; //0 - only single dimension supported
        TT.NestedDataSet.Next;
    end;
end;

亲切的问候

关于postgresql - 在 Delphi 上使用 FireDAC 从 sql 表中获取文本 [] 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43317660/

相关文章:

没有外键的两个表之间的django queryset

mysql - ZeosLib与MYSQL的共享内存协议(protocol)?

delphi - 如何获取 ListView 中的项目和子项目?

image - 在 tlistbox 中绘制缩略图

delphi - 将应用程序从 FIB+ 迁移到 Fire-DAC 组件的经过验证/推荐的方法

delphi - TFDQuery 和 SQLite : Type mismatch for field, 期望:LargeInt 实际:WideString

sql - PostgreSQL 间隔错误

postgresql - 使用 Pentaho 访问 PostgreSQL 中的非公共(public)模式

postgresql - 我有一篇由 bool 字段管理的文章 "state",但是当复选框被保存为已发布时,如何获取第一个日期(时间戳)?

postgresql - 有没有办法让 Delphi 的 FireDAC 识别 FireDAC 生成的 PostgreSQL 位置参数?