【问题标题】:DBExpress: How to find a primary key field?DBExpress:如何找到主键字段?
【发布时间】:2013-01-22 09:42:19
【问题描述】:

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

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

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

【问题讨论】:

  • Select * from table1 join table 2 join storedprocedure3 join someview5 join .... 什么字段是主要字段?
  • 我的查询仅适用于单个表
  • 但是库,如果它提供这个功能,就必须与任何查询一起工作
  • 也许图书馆有办法解决我的问题……

标签: delphi delphi-xe2 dbexpress


【解决方案1】:

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

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

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

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

  ...
  if FCommandType = ctTable then
    TableName := FCommandText
  else
    TableName := GetTableNameFromSQL(CommandText);
  DataSet := FSQLConnection.OpenSchemaTable(stIndexes, TableName, '', '', '');
  ...

【讨论】:

    【解决方案2】:

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

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

    对于 Oracle 数据库,请在 user_indexes 上查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 2020-02-27
      相关资源
      最近更新 更多