使用 Delphi 上的 FireDAC 从 sql table 获取文本 [] 值
Get text[] value from sql table with FireDAC on Delphi
在 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);
wchich 翻译成 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;
亲切的问候
在 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);
wchich 翻译成 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;
亲切的问候