【问题标题】: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 article 从 TAdoQuery 的角度涵盖了这一点。 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
相关资源
最近更新 更多