【问题标题】:borland builder c++ oracle questionborland builder c++ oracle 问题
【发布时间】:2011-05-20 04:13:14
【问题描述】:

我有一个调用 Oracle 10g 数据库的 Borland builder c++ 6 应用程序。通过局域网操作。当有问题的应用程序进行简单的数据库选择时,例如

select table_name from  element_tablenames where element_id = 10023842

Oracle 中记录了以下情况(来自性能日志)

select table_name 
  from element_tablenames 
 where element_id = 10023842

然后立即(不是来自 C++ 源代码,但可能更深入)

select table_name, element_tablenames.ROWID 
  from element_tablenames 
 where element_id = 10023842

select 语句仅在 TADODbQuery 对象中调用一次,但正在执行两个查询 - 一个用于解析,另一个添加 ROWID 用于执行。

通过 WAN 和很多很多查询,这对用户来说显然是个问题。

有谁知道为什么会发生这种情况,有人可以提出解决方案吗?

【问题讨论】:

  • 返回的数据是否需要编辑? RowID 很可能是必需的,因为正在获取可编辑的数据集。
  • 嗨,数据刚刚被读取。需要明确的是,第二条 SQL 语句不是由 C++ 代码发送的。只有第一个这样做..我假设 oracle 客户端或其他东西正在进行第二个 SQL 调用,因为它不是来自 c++ 源代码。 :)
  • 我不了解Oracle,但是对于其他数据库,您可以添加“for read only”子句以提供更好的提示。

标签: c++ oracle ado c++builder


【解决方案1】:

同意罗伯特。

ROWID 唯一标识表中的一行,以便返回的记录可以通过任何更改(或作为 DELETE)应用回数据库。

有没有办法将特定列(或一组列)标识为主键,以便在不使用 ROWID 的情况下使用它来标识行。

【讨论】:

  • 谢谢 - 数据刚刚被读取 - 仅此而已。另见我对罗伯特的回复。干杯
【解决方案2】:

我不知道 RowID 的确切来源,它可能是 TAdoQuery 实现或 Oracle 驱动程序。但我确信我找到了原因。

来自Oracle docs

如果数据库表不包含主键,则在填充 DataTable 时必须显式选择 ROWID。

所以我怀疑你的表没有主键,要么添加一个主键,要么添加 rowid。 无论哪种方式,这都将解决重复查询问题。

因为您关心性能。一般

使用TAdoQuery,您可以设置CursorType 来优化不同的行为以提高性能。 This articleTAdoQuery 的角度涵盖了这一点。 MSDN also has an article 从一般的 ADO 角度涵盖它。最后specifications from the Oracle Driver 很有用。

我建议将光标设置为任一,因为它们是 Oracle 唯一支持的

  • ctStatic - 产生双向查询。
  • ctOpenForwardOnly - 产生单向查询,最快但不能调用 Prior

您还可以与CursorLocation 一起玩,看看它对您的速度有何影响。

【讨论】:

  • 非常感谢您的回复...我已经检查过了,该表确实有一个主键。 “element_id”行是主键列。我会调查你的其他建议。
  • @Buzz 我也会尝试最初将 rowid 添加到查询中,然后查看是否只执行了一个查询。
  • 您好,我找到了问题所在。来自 Borland c++ 书 22-47 “准备查询”。 “准备查询是查询执行之前的可选步骤。准备查询会将 SQL 语句及其参数(如果有)提交给数据访问层和数据库服务器以进行解析、资源分配和优化”....所以除非您将 Prepared 属性设置为 true,否则数据层会对数据库进行两次调用,这就是导致两次调用的原因。我确实将光标的类型更改为仅转发,这解决了 rowid 问题。
猜你喜欢
  • 1970-01-01
  • 2014-12-10
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多