如何使用SQLCancel从线程B中取消线程A中的SQL

时间:2013-02-16 02:33:55

标签: sql multithreading delphi odbc

我需要在一个线程中同步运行SQL命令,并能够从另一个线程取消查询。

据我所知,我需要ODBC函数SQLCancel和连接对象的句柄来完成此任务。

然而,作为这个领域的新秀,想到这一点感觉就像是一场艰苦的战斗。

有人可以在Delphi 2006中为我提供示例代码吗?

设置说明:

主题A

ODBC_Connection.Execute('SELECT a,b,c INTO ## MyTable FROM LongRunningQuery')

主题B

[使用SQLCancel取消线程A中的SQL语句的一些神奇代码]

  

注意:我有一个当前的解决方案,我利用ADOCommand对象异步执行查询。这使得可以使用Command对象的Cancel方法。但这很慢,因为我有一个带有Sleep函数的while循环来轮询命令的状态以查看它何时完成。这就是为什么我想要一个基于同步执行的解决方案。我有数百个查询,所以性能很重要。

其他信息:我使用SQL Server作为后端,因此这是我正在寻找的主要解决方案。关于处理Oracle和其他数据库的建议当然也很有意思,但在我的情况下是次要的。

2 个答案:

答案 0 :(得分:1)

这完全取决于您的数据库后端,数据库客户端和您使用的DAL。

数据库服务器和客户端必须支持从不同的线程访问相同的底层连接和语句句柄。

DAL需要允许您访问它。

  • DAL:我知道AnyDAC does,但从未尝试过ODBC。您的问题表明ODBC API支持它,但我不确定Delphi ODBC包装器是否支持它。
  • 数据库服务器:至少Oracle和SQL Server支持此功能。

答案 1 :(得分:0)

根据ODBC规范,SQLCancel可以在语句中取消以下类型的处理:

  • 在语句上异步运行的函数(听起来就像你已经完成的那样)
  • 需要数据的语句上的函数(示例是SQLExecute返回SQL_NEED_DATA)
  • 在另一个线程上的语句上运行的函数(听起来像这是你想要的)

我个人完成了上面的前两个但从来没有完成过。您还需要一个线程安全的ODBC驱动程序(有些甚至不是ODBC规范说它们应该是)。至于你如何在Delphi中这样做,我不知道。