【问题标题】:Is Query.Close necessary after Query.ExecSQL?Query.ExecSQL 之后是否需要 Query.Close?
【发布时间】:2014-11-28 13:20:57
【问题描述】:

在 Delphi 中,每当我使用 TQuery 对数据库执行 SELECT 时,我都会在 Query.Open 之后使用 try..finally,在 finally 部分使用 Query.Close。这对我来说很有意义,因为查询仍然会不必要地存储数据(使用内存)。

但是我的问题与我使用 Query 执行 INSERT 或 DELETE 时有关,因此需要使用 Query.ExecSQL 执行 SQL 我的问题是,我必须在 Query.ExecSQL 之后使用 Query.Close 吗?

我的想法是,因为这是要在数据库上执行的命令,想必不会给Query返回任何数据,所以没必要做Query.Close 但是,也许有人更深入地了解在调用 Query.ExecSQL 之后可能会返回并存储在 Query 中的内容(如果有的话),而 Query.Close 会对此有所帮助?

谢谢。

【问题讨论】:

  • 它总是会返回一些东西,例如更新或插入的行。据我所知,您始终必须关闭查询。
  • 我从来没有在 ExecSQL 之后这样做过。只要您清除 SQL 属性,数据集就会关闭。我认为这两种方式都不疼。
  • OpenClose 只是将Active 属性分别设置为TrueFalse 的替代方法。在调用ExecSQL 之后检查Active 的值,你就会得到答案。

标签: delphi sql-insert tquery


【解决方案1】:

不需要,因为ExecSQL 不维护记录集。

来自documentation(强调我的):

执行查询的 SQL 语句。调用 ExecSQL 执行 当前分配给 SQL 属性的 SQL 语句。使用 ExecSQL 来 执行不向数据返回游标的查询(例如 INSERT、 更新、删除和创建表)。

注意:对于 SELECT 语句,调用 Open 而不是 ExecSQL。

如果 SQL 属性中的语句尚未准备好,则 ExecSQL 将准备执行该语句。为了提高性能,应用程序通常应该在第一次调用 ExecSQL 之前调用 Prepare。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2011-10-28
    • 1970-01-01
    • 2018-07-03
    • 2019-10-13
    • 2014-11-21
    • 2018-10-18
    相关资源
    最近更新 更多