【问题标题】:Delphi: Cannot perform this operation on an open datasetDelphi:无法在打开的数据集上执行此操作
【发布时间】:2019-03-07 12:51:02
【问题描述】:

当我尝试将 FireDAC FDQuery 与 MySQL 数据库一起使用时,出现以下错误:

Cannot perform this operation on an open dataset.
query.Open(....my connection string to MySQL....); 
try
    query.ExecSql;
finally
    query.Close;

我通过双击表单上的图标来填写 FDQuery。我也 连接到数据库进行测试。它正确地返回了结果。 我想从代码中使用它,但它不起作用,所以 我调试了它。我总是到达断点:query.Close;

【问题讨论】:

    标签: mysql delphi firemonkey firedac


    【解决方案1】:

    你不能在同一个 SQL 上调用 OpenExecSQL,因为它们做不同的事情。

    当查询将返回结果集时使用Open,这意味着SELECT。当查询返回结果集时使用ExecSQL,这意味着INSERTDELETEUPDATE

    我不能告诉你哪一个适用于你的情况,因为你没有在你的帖子中包含你的 SQL。

    【讨论】:

      【解决方案2】:

      我不具体了解 FireDAC,但一般来说,对于这类数据库组件,对于不返回结果集的查询,因此适用于 ExecSQL,您可能希望在 Connection 对象上使用 ExecSQL,在这种情况下为 TFDConnection . (这可能是您的 FDQuery 对象连接到的 Connection 对象。) http://docwiki.embarcadero.com/RADStudio/Rio/en/Executing_Commands_(FireDAC) 显然 TFDCustomQuery 上有一个 ExecSQL 方法,但我不确定你为什么要使用它,而且正如你所发现的,如果查询已经在使用中,它就不起作用。

      【讨论】:

      • 想要使用查询的 ExecSQL 的原因取决于查询的复杂性。您可能处于不想在代码中构建查询(传递给 TfdConnection.ExecSQL)的情况,它有多个参数、子选择等。而不是在一个Delphi 方法中,TFDQuery 对象内置了它们(特别是当查询本身是静态的但很复杂时)。只是另一个可用的工具。
      • @JacalarRick 您似乎在描述使用 Query 的 SQL 属性而不是 ExecSQL 方法的基本原理。
      • 是和不是。是的,因为使用 TFDQuery 的目的是因为需要使用 SQL 属性。但是(否)SQL 中的查询不必返回数据集(TfdQuery.Open),而可以只对数据库进行操作(TfdQuery.ExecSQL)。关键是使用 TfdConnection 的 ExecSQL 还是 TfdQuery 的 ExecSQL 确实是代码管理的一种功能。你说“你为什么要使用它”。
      • @JacalarRick 啊,我明白你的意思了。我在文档中看到将 TFDQuery 与 .SQL 和 .ExecSQL(相对于 Connection 的 ExecSQL)一起使用的好处是您可以使用 .Prepare 来加速多次调用。旁注:OP 的代码“query.Open(....my connection string to MySQL....);”我认为这并不完全有意义,因为我在文档中没有看到需要连接字符串的 Open 的重载版本。无论如何,由于在OP的代码query.ExecSQL中没有参数,OP可能只是不知道Open语句已经执行了SQL,另外不需要ExecSQL。
      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多