Delphi-dbGo / Oracle方法GetFieldNames不返回任何数据

问题描述

Delphi Rio-我才刚刚开始学习ADO,特别是连接到本地Oracle RDBMS(Oracle 12.2 64位)的dbGo组件。我能够连接,发出简单查询等。我找到了TADOConnection.GetFieldNames方法,并且正在对其进行试验。我无法使其正常工作。这是我的代码...

procedure TForm1.BitBtn1Click(Sender: TObject);
var
S1 : TStringList;

begin
 S1 := TStringList.Create;
 ADO1.Connected := True;
 ADO1.GetFieldNames('EGR.ACCOUNTS',S1);
 //ADO1.GetTableNames(S1,False);
 ShowMessage(IntToStr(S1.Count));
 S1.Free;
end;

我尝试使用和不使用Schema名称,但是S1.Count始终返回0。GetTableNames函数可以正常工作。如果我进入sql * Plus进行查询,我会看到适当的数据

select count(*) from EGR.ACCOUNTS;

所以我知道我的SCHEMA.TABLENAME是正确的。我在做什么错了?

解决方法

您需要将其分配给类型为items的字符串列表的TStrings属性。

procedure GetFieldNames(const TableName: string; List: TStrings);

,

要按名称访问数据字段,请使用以下代码:

var
    FieldEgrAccount : TField;
begin
    FieldEgrAccount := AdoQuery1.FieldByName('SomeFieldName');
    Memo1.Lines.Add(FieldEgrAccount.AsString);
end;

如果您确实需要所有字段名称,请使用以下代码:

var
    Names : TStringList;
begin
    Names := TStringList.Create;
    try
        AdoQuery1.GetFieldNames(Names);
        // Do something with the field names

    finally
        Names.Free;
    end;
end;

每个字段使用一个TField,一次获取一次,然后根据需要重复使用它(使表单或数据模块类的变量字段重复使用)要快得多。 FieldByName相对昂贵,因为它必须扫描字段名称列表。