ADO - 如何获取主键字段

时间:2013-07-26 15:05:08

标签: database delphi ado c++builder vcl

我正在使用ADO(Delphi和C ++ Builder),我想获得一些TADOTable组件中的主键字段(它们的名称)。怎么做?

我发现我需要使用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;

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

2 个答案:

答案 0 :(得分:4)

OpenSchema Method (ADO)的引用,可以找到here

的示例

Delphi for 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 );

答案 1 :(得分:3)

建立连接并照常打开(使用TADOConnection.ConnectionStringTADOConnection.Open),然后使用OpenSchema询问架构。您提供的TADODataSet作为最后一个参数将包含RecordSet,您可以像使用任何其他数据集一样使用{。}}。

这是一个快速的示例,我把它放在一起(感谢@bummi对第三个参数的修正 - UnassignedNull都已编译,但在测试时实际上没有工作)。我在新表单上删除了TADOConnectionTADODataSetTMemo,并快速配置TADOConnection以指向我进行某些测试的简单SQL Server Express数据库 - 我包括连接字符串;我对它所做的唯一更改是Data Source部分中提供的计算机名称。

procedure TForm3.FormShow(Sender: TObject);
var
  i: Integer;
  sLine: string;
begin
  Memo1.Clear;
  ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;' +
                                     'Integrated Security=SSPI;' + 
                                     'Persist Security Info=False;' +
                                     'Initial Catalog=Contacts;' +
                                     'Data Source=MyComputer\SQLEXPRESS';
  ADOConnection1.Connected := True;
  ADOConnection1.OpenSchema(siPrimaryKeys, Unassigned, EmptyParam, ADODataSet1);
  sLine := '';
  for i := 0 to ADODataSet1.FieldCount - 1 do
    sLine := sLine + ADODataSet1.Fields[i].FieldName + #9;
  Memo1.Lines.Add(sLine);
  Memo1.Lines.Add('');

  while not ADODataSet1.Eof do
  begin
    sLine := '';
    for i := 0 to ADODataSet1.FieldCount - 1 do
      sLine := sLine + ADODataSet1.Fields[i].AsString + #9;
    Memo1.Lines.Add(sLine);
    ADODataSet1.Next;
  end;
end;

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

TSchemaInfo = (siAsserts, siCatalogs, siCharacterSets, siCollations,
  siColumns, siCheckConstraints, siConstraintColumnUsage,
  siConstraintTableUsage, siKeyColumnUsage, siReferentialConstraints,
  siTableConstraints, siColumnsDomainUsage, siIndexes, siColumnPrivileges,
  siTablePrivileges, siUsagePrivileges, siProcedures, siSchemata,
  siSQLLanguages, siStatistics, siTables, siTranslations, siProviderTypes,
  siViews, siViewColumnUsage, siViewTableUsage, siProcedureParameters,
  siForeignKeys, siPrimaryKeys, siProcedureColumns, siDBInfoKeywords,
  siDBInfoLiterals, siCubes, siDimensions, siHierarchies, siLevels,
  siMeasures, siProperties, siMembers, siProviderSpecific);