我有一个基于动态创建的 SQL 查询的 TSimpleDataSet。我需要知道哪个字段是主键?
SimpleDataSet1.DataSet.SetSchemaInfo(stIndexes, 'myTable' ,'');
这段代码告诉我我有一个名为“someName”的主键,但我怎么知道哪个字段(列)与这个索引一起使用?
我有一个基于动态创建的 SQL 查询的 TSimpleDataSet。我需要知道哪个字段是主键?
SimpleDataSet1.DataSet.SetSchemaInfo(stIndexes, 'myTable' ,'');
这段代码告诉我我有一个名为“someName”的主键,但我怎么知道哪个字段(列)与这个索引一起使用?
主键/索引可以属于多个列(不仅仅是一个)。
模式stIndexes
数据集将返回 PK 名称INDEX_NAME
和构成该 PK/索引 ( COLUMN_NAME
) 的列。INDEX_TYPE
将告诉您您拥有哪些索引类型 ( eSQLNonUnique/eSQLUnique/eSQLPrimaryKey
)。
我从未使用过,TSimpleDataSet
但请检查索引信息是否存储在其中
IndexDefs[TIndexDef].Name/Fields/Options
- 如果ixPrimary
在其中,Options
那么这就是您的 PK。并且Fields
属于该索引。
看看源代码SqlExpr.pas
:TCustomSQLDataSet.AddIndexDefs
。请注意如何从命令文本TCustomSQLDataSet
返回TableName
(然后是索引信息):
...
if FCommandType = ctTable then
TableName := FCommandText
else
TableName := GetTableNameFromSQL(CommandText);
DataSet := FSQLConnection.OpenSchemaTable(stIndexes, TableName, '', '', '');
...
我认为简单的数据集没有提供这些信息。
但是,我确信有相应的组件。对于 Oracle 数据库,检查Devart 的 ODAC。基本上,它只涉及对数据库的一次查询。但是,默认情况下组件不会提供它,因为它涉及不同的查询,因此会导致响应时间变慢。
对于 Oracle 数据库,查询user_indexes
.