加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 在Delphi上使用FireDAC从sql表中获取text []值

发布时间:2020-12-13 18:05:57 所属栏目:百科 来源:网络整理
导读:在带有简单查询’select * from data’的pgAdmin上,我只得到一条包含字段类型text []的记录,其值为'{“1”,“2”,“3”}’. 以下简化代码仅返回值的“1”部分: function GetData: string;var q: TFDQuery; s: string; i: integer; av: array of variant; as
在带有简单查询’select * from data’的pgAdmin上,我只得到一条包含字段类型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 cast(它适用于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 builder XE6我只得到第一个数组项). Firedac将PostgreSQL数组字段作为嵌套数据集处理,因此如果上述内容对您不起作用,
在C中你可以使用PG数组作为普通的DataSet,通过移动光标访问项目,例如:

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的wchich看起来像(可能拼写错误):

...
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;

亲切的问候

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读