我正在使用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;
运行此代码时,我得到:“对象或提供程序无法执行请求的操作。”?
答案 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.ConnectionString
和TADOConnection.Open
),然后使用OpenSchema
询问架构。您提供的TADODataSet
作为最后一个参数将包含RecordSet
,您可以像使用任何其他数据集一样使用{。}}。
这是一个快速的示例,我把它放在一起(感谢@bummi对第三个参数的修正 - Unassigned
和Null
都已编译,但在测试时实际上没有工作)。我在新表单上删除了TADOConnection
,TADODataSet
和TMemo
,并快速配置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);