2

我正在使用 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;

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

4

2 回答 2

4

OpenSchema 方法 (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 );
于 2013-07-26T16:14:26.973 回答
3

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

这是我放在一起的一个快速示例(感谢@bummi 对第三个参数的更正 -Unassigned两者都已Null编译,但在测试时实际上并没有工作)。我在一个新表单上删除了一个TADOConnection, TADODataSet, 并快速配置为指向一个简单的 SQL Server Express 数据库,我有一些测试 - 我包括了连接字符串;我对其所做的唯一更改是在该部分中提供的计算机名称中)。TMemoTADOConnectionData 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 帮助文件中(请注意,文档说并非所有这些都可以通过 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);
于 2013-07-26T16:13:37.827 回答