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

Delphi-dbGo/Oracle方法GetFieldNames不返回任何数据,oracle,delphi,ado,Oracle,Delphi,Ado,Delphi Rio-我刚刚开始学习ADO,特别是dbGo组件,它连接到本地Oracle RDBMS(Oracle 12.2 64位)。我能够连接,发出简单的查询,等等。我找到了方法TADOConnection.GetFieldNames,我正在试验它。我无法让它工作。这是我的密码 procedure TForm1.BitBtn1Click(Sender: TObject); var S1 : TStringList; begin S1 := TStringList.Create; ADO

Delphi Rio-我刚刚开始学习ADO,特别是dbGo组件,它连接到本地Oracle RDBMS(Oracle 12.2 64位)。我能够连接,发出简单的查询,等等。我找到了方法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;
我尝试过使用和不使用架构名称,但S1.Count始终返回0。GetTableNames函数工作正常。如果我进入SQL*Plus并查询,我会看到相应的数据

select count(*) from EGR.ACCOUNTS;

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

您需要将其分配给stringlist的
属性,该属性的类型为
TStrings


procedure getfieldname(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;
如果确实需要所有字段名,请使用以下代码:

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、获取一次并根据需要多次重用它(生成表单或datamodule类的变量字段)要快得多。FieldByName成本相对较高,因为它必须扫描字段名列表。

不幸的是,这没有帮助(将S1从TStringlist更改为TStrings)。根据您的评论,文档将使用TListbox.Items作为示例显示。这也不起作用。虽然我假设这可能适用于给定的查询,但我遇到的问题与TADOConnection.GetFieldNames有关。它有两个参数,一个是我要查看其字段的表名,另一个是要将字段列表放置在何处的字符串。虽然我可以像您所展示的那样使用代码来解决这个问题,但我正在学习ADO,并试图确定为什么应该工作的东西没有。TADOConnection.GetFieldNames似乎链接到TAdoTable组件。也许您应该首先将TAdoTable链接到TAdoConnection,然后才请求该表的字段名。只是猜测而已。