簡體   English   中英

在Delphi上使用FireDAC從sql表中獲取text []值

[英]Get text[] value from sql table with FireDAC on Delphi

在帶有簡單查詢'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文檔說你應該使用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 ++構建器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;

親切的問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM