【问题标题】:Delphi XE7 TFDTable View RowID errorDelphi XE7 TFDTable查看RowID错误
【发布时间】:2015-06-13 12:18:24
【问题描述】:

我正在将 Delphi 5 / BDE 应用程序转换为 Delphi XE7 / FireDAC。我的一个表单有一个TFDTable 组件,它指向一个Oracle 视图,该视图在其create 语句中包含一个group by 子句。

这曾经在 BDE 应用程序中运行良好,但使用 FireDAC 时出现此错误。

ORA-01446: 无法从具有 DISTINCT 的视图中选择 ROWID 或采样, GROUP BY 等。

我了解我从 Oracle 收到的错误,但我没有选择 ROWID,FireDAC 是! TFDTable 中是否有一个属性,我可以设置它以防止它将ROWID 添加到查询中?如果没有,我应该如何使用这个视图?

【问题讨论】:

  • 我已经分配了奖金,因为我在 FetchOptions.Items 中遇到了与 fiMeta 相同的问题。德尔福东京 10.2.3。目前的答案显然是不够的。
  • @Jan,ROWID 列的附加由 ReadOnly 属性驱动。在这种情况下,这还不错。只是无法识别可能已从多个元组中分组的特定元组。见下文...

标签: oracle delphi delphi-xe7 firedac


【解决方案1】:

FireDAC 获取ROWID,因为它尝试识别结果集中的元组以进行可能的更新。要停止这种情况,只需启用 ReadOnly 选项,该选项将正确地使分组视图结果集只读(正确地,如果它们被分组在结果集中进行更新,则不能仅识别特定元组)。

TFDPhysCommandGenerator.GenerateSelectTable方法生成的SQL命令,如果你想知道这个问题的根源。根据ReadOnly 属性设置(对于Oracle DBMS 为ROWID),选择列表中附加了通用唯一元组标识符。

【讨论】:

    【解决方案2】:

    FetchOptions.Items 中包含fiMeta

    TFDQuery、TFDTable、TFDMemTable 和 TFDCommand 自动检索 主要的唯一标识列 (mkPrimaryKeyFields) (第一个)SELECT ... FROM ... 语句中的表,当 fiMeta 是 包含在 FetchOptions.Items 中。注意:

    mkPrimaryKeyFields 查询可能很耗时; 当 FireDAC 无法正确确定它们时,应用程序可能需要明确指定唯一标识列。

    要显式指定列,请从 FetchOptions.Items 中排除 fiMeta, 并使用以下选项之一:

    将 UpdateOptions.KeyFields 设置为 ';'分隔的列名列表; 将 pfInKey 包含到相应的 TField.ProviderFlags 属性中。

    当应用程序创建持久性字段时,最初 TField.ProviderFlags 将被正确设置。之后,自动 字段设置不会发生,当数据库结构或查询是 改变了。您应该手动更新 ProviderFlags 以调整列 列表。此外,如果主键由多个字段组成,那么所有 它们必须包含在持久字段中。行标识列

    或者,可以将行标识列包含在 选择列表。当 FireDAC 找到这样的列时,它不会检索 mkPrimaryKeyFields 元数据,它将使用此列。 支持的 DBMS 如下:

    DBMS 行标识列

    火鸟 DB_KEY

    Informix ROWID

    Interbase DB_KEY / RDB$DB_KEY

    Oracle ROWID

    PostgreSQL OID。必须使用 OID 创建表。

    SQLite ROWID

    来源:http://docwiki.embarcadero.com/RADStudio/XE8/en/Unique_Identifying_Fields_%28FireDAC%29

    【讨论】:

    • 谢谢瓦尔。我忘了说我已经读过那篇文章了。实际上,它说在 FetchOptions.Items 中删除 fiMeta(它被选中)。然而,这并没有什么不同,所以我以为我找错地方了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多