Database ADO-如何获取主键字段 我使用ADO(Delphi和C++ Builder),我希望得到一些可调组件中的主键字段(它们的名字)。怎么做

Database ADO-如何获取主键字段 我使用ADO(Delphi和C++ Builder),我希望得到一些可调组件中的主键字段(它们的名字)。怎么做,database,delphi,ado,c++builder,vcl,Database,Delphi,Ado,C++builder,Vcl,我发现我需要使用ADOConnection->OpenSchema,但不知道如何使用它 现在我试着这样做: int bounds[] = {0,2}; OleVariant A(bounds,1, varVariant); A.PutElement(varEmpty,0); A.PutElement(varEmpty,1); A.PutElement("MyDBTable",2); OleVariant EmptyParam; EmptyParam.VType = VT_ERROR; Emp

我发现我需要使用ADOConnection->OpenSchema,但不知道如何使用它

现在我试着这样做:

int bounds[] = {0,2};
OleVariant A(bounds,1, varVariant);
A.PutElement(varEmpty,0);
A.PutElement(varEmpty,1);
A.PutElement("MyDBTable",2);


OleVariant EmptyParam;
EmptyParam.VType = VT_ERROR;
EmptyParam.VError = DISP_E_PARAMNOTFOUND;
TADODataSet *temp = new TADODataSet(NULL);

AdoConnection1->OpenSchema(siPrimaryKeys, A, EmptyParam, temp);
temp->Open();
temp->First();
while (!temp->Eof)
{
    Memo1->Lines->Add(temp->Fields->Fields[0]->AsString);
    temp->Next();
}
temp->Close();
delete temp;

运行此代码时,我得到:“对象或提供程序无法执行请求的操作。”?

您建立连接并像往常一样打开它(使用
TADOConnection.ConnectionString
TADOConnection.open
),然后使用
OpenSchema
请求模式。作为最后一个参数提供的
TADODataSet
将包含一个
记录集
,您可以像使用任何其他数据集一样使用该记录集

下面是我收集的一个快速示例(感谢@bummi对第三个参数的更正-
Unassigned
Null
都已编译,但在测试时实际上不起作用)。我在一个新表单上删除了一个
TADOConnection
tadocataset
TMemo
,并快速配置了
TADOConnection
,以指向一个简单的SQL Server Express数据库进行测试-我包括了连接字符串;我对它所做的唯一更改是
数据源
部分中提供的计算机名称)

SchemaInfo
值(传递给
OpenSchema
的第一个参数)的可能值可以在
ADODB
单元中找到-它们记录在中(注意,文档中说并非所有值都可以通过ADO获得):

有关的参考资料,可以找到示例

在Delphi中针对Microsoft Access和MSSqlServer的示例实现如下所示:

Procedure OpenPrimaryKeyInfo ( Connection:TAdoConnection
                             ; DatabaseName , SchemaName , TableName : Variant
                             ; Display:TAdodataset );
begin
  Connection.OpenSchema( siPrimaryKeys
                        , VarArrayOf([ DatabaseName , SchemaName , TableName ])
                        , EmptyParam , Display );
end;
Microsoft Access的调用示例:

OpenPrimaryKeyInfo( AdoConnection2 , UnAssigned , UnAssigned , 'TableX' , Adodataset1 );
MSSqlServer的调用示例:

OpenPrimaryKeyInfo( AdoConnection1 , 'MyDataBase' , 'dbo' , 'TableX' , Adodataset1 );

这看起来很棒。只是。。如何在VC++ Builder?@ TraceR中编写ValaRayOf([DabaseAsNeNe],StasnAsMeNeNeNeNe.TabLeNAME]:显示C++的Builder语法(还有一个C++代码示例链接到该页面的底部)。第二个未被赋值的需要是EmptyParam,我不能让它与未赋值一起工作。@ BuMi:是的,你是绝对正确的。它使用
Null
Unassigned
进行编译,但在实际运行代码时失败。我已经纠正了它(由于您发现了它,所以给予了您适当的信任),并包含了实际工作的测试代码。谢谢你的帮助。(顺便说一句,我已经对你的答案投了赞成票):-)
OpenPrimaryKeyInfo( AdoConnection2 , UnAssigned , UnAssigned , 'TableX' , Adodataset1 );
OpenPrimaryKeyInfo( AdoConnection1 , 'MyDataBase' , 'dbo' , 'TableX' , Adodataset1 );