1

我有一个基于动态创建的 SQL 查询的 TSimpleDataSet。我需要知道哪个字段是主键?

SimpleDataSet1.DataSet.SetSchemaInfo(stIndexes, 'myTable' ,'');

这段代码告诉我我有一个名为“someName”的主键,但我怎么知道哪个字段(列)与这个索引一起使用?

4

2 回答 2

4

主键/索引可以属于多个列(不仅仅是一个)。

模式stIndexes数据集将返回 PK 名称INDEX_NAME和构成该 PK/索引 ( COLUMN_NAME) 的列。INDEX_TYPE将告诉您您拥有哪些索引类型 ( eSQLNonUnique/eSQLUnique/eSQLPrimaryKey)。

我从未使用过,TSimpleDataSet但请检查索引信息是否存储在其中 IndexDefs[TIndexDef].Name/Fields/Options- 如果ixPrimary在其中,Options那么这就是您的 PK。并且Fields属于该索引。

看看源代码SqlExpr.pasTCustomSQLDataSet.AddIndexDefs。请注意如何从命令文本TCustomSQLDataSet返回TableName(然后是索引信息):

  ...
  if FCommandType = ctTable then
    TableName := FCommandText
  else
    TableName := GetTableNameFromSQL(CommandText);
  DataSet := FSQLConnection.OpenSchemaTable(stIndexes, TableName, '', '', '');
  ...
于 2013-01-22T21:00:40.160 回答
1

我认为简单的数据集没有提供这些信息。

但是,我确信有相应的组件。对于 Oracle 数据库,检查Devart 的 ODAC。基本上,它只涉及对数据库的一次查询。但是,默认情况下组件不会提供它,因为它涉及不同的查询,因此会导致响应时间变慢。

对于 Oracle 数据库,查询user_indexes.

于 2013-01-22T10:05:44.250 回答