C++ 如何取消长时间运行的QSqlQuery?

C++ 如何取消长时间运行的QSqlQuery?,c++,qt5,qsqlquery,qsqldatabase,C++,Qt5,Qsqlquery,Qsqldatabase,如何取消长时间运行的QSqlQuery 数据库正在返回3M+行,如QTableView控件所示。我希望能够强制停止这两项长期操作: 当数据库运行长时间操作时 如果数据库速度很快,但需要返回大量的行,那么处理/复制/显示这些行会花费很多时间 第二个项目符号,可以通过不使用QSqlQueryModel来解决。在这种情况下,可以分阶段手动解析查询结果,这将得到实现,但我也想知道是否可以中断和取消移动data DB->QTableView的过程 我尝试过以下方法但没有成功: QSqlQuery::fi

如何取消长时间运行的QSqlQuery

数据库正在返回3M+行,如QTableView控件所示。我希望能够强制停止这两项长期操作:

  • 当数据库运行长时间操作时
  • 如果数据库速度很快,但需要返回大量的行,那么处理/复制/显示这些行会花费很多时间
  • 第二个项目符号,可以通过不使用QSqlQueryModel来解决。在这种情况下,可以分阶段手动解析查询结果,这将得到实现,但我也想知道是否可以中断和取消移动data DB->QTableView的过程

    我尝试过以下方法但没有成功:

    • QSqlQuery::finish()
    • QFuture::cancel()
    • QSQLDABASE.close()--这一个使应用程序崩溃
    如果需要完整的上下文,则可以使用。所讨论的方法是

    on_button_stopQuery_released
    

    在执行过程中中止查询(不是抓取,这是QSqlQuery::finish所做的)在所有数据库中都是偶然的。Qt本身不支持这一点;解决方法将是后端特定的

    例如,使用PostgreSQL可以执行以下操作:

    • 在原始连接中,检索连接ID(
      选择pg_backend_pid();
      )并保存它
    • 当您想中止查询时,打开第二个连接并通过发出
      SELECT pg\u cancel\u backend(保存的\u id)终止查询
    SQLite具有
    sqlite3\u中断(sqlite3*)
    。这会中断查询,并且不会关闭连接

    MySQL与PostgreSQL类似:

    • 首先检索连接ID(
      选择连接ID();
    • 然后通过另一个连接杀死它(
      kill[connection | QUERY]$connection\u id
    正如您所看到的,即使提供的功能也是特定于后端的。Postgres只能中止连接,而SQLite只能中止查询。因此,实现这一点的最简单方法是,如果查询被中止并且连接仍然有效,则放弃连接。然后,您可以有一个用于取消管理的简单双API接口(伪代码,即Python):

    class I连接取消:
    def寄存器(连接):
    #保存/检索连接ID
    def cancel():
    #打开第二个连接,发送后端特定查询
    


    对于大的结果集,在模型中考虑使用<代码> CANTFEXMORE 和<代码> FETCHOMENE/CODE>。这样,在向用户显示某些结果之前,您不必处理整个结果集;使用起来可能会感觉更平滑。当然,由于order by或grouping子句等原因,这对固有的查询执行延迟没有帮助。

    在执行期间中止查询(不是获取,这是QSqlQuery::finish所做的)在所有数据库中都是命中和未命中的。Qt本身不支持这一点;解决方法将是后端特定的

    例如,使用PostgreSQL可以执行以下操作:

    • 在原始连接中,检索连接ID(
      选择pg_backend_pid();
      )并保存它
    • 当您想中止查询时,打开第二个连接并通过发出
      SELECT pg\u cancel\u backend(保存的\u id)终止查询
    SQLite具有
    sqlite3\u中断(sqlite3*)
    。这会中断查询,并且不会关闭连接

    MySQL与PostgreSQL类似:

    • 首先检索连接ID(
      选择连接ID();
    • 然后通过另一个连接杀死它(
      kill[connection | QUERY]$connection\u id
    正如您所看到的,即使提供的功能也是特定于后端的。Postgres只能中止连接,而SQLite只能中止查询。因此,实现这一点的最简单方法是,如果查询被中止并且连接仍然有效,则放弃连接。然后,您可以有一个用于取消管理的简单双API接口(伪代码,即Python):

    class I连接取消:
    def寄存器(连接):
    #保存/检索连接ID
    def cancel():
    #打开第二个连接,发送后端特定查询
    


    对于大的结果集,在模型中考虑使用<代码> CANTFEXMORE 和<代码> FETCHOMENE/CODE>。这样,在向用户显示某些结果之前,您不必处理整个结果集;使用起来可能会感觉更平滑。当然,由于order by或grouping子句等原因,对固有的查询执行延迟没有帮助。

    fetchMore是否真的适用于postgres?文档说明它只适用于不报告数据集大小(即行数)的数据库。在postgres中,它似乎加载了所有行……啊,我看到您正在使用QSqlQueryModel。在这种情况下,fetchMore是否真的可以用于postgres?文档说明它只适用于不报告数据集大小(即行数)的数据库。在postgres中,它似乎加载了所有行……啊,我看到您正在使用QSqlQueryModel。那样的话,没有。