创建驱动程序应用程序 - 异步模式和 SQLCancel

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

重要

SQL Server Native Client (SNAC) 未随附:

  • SQL Server 2022 (16.x) 及更高版本
  • SQL Server Management Studio 19 及更高版本

不建议使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧的 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)进行新的应用程序开发。

对于新项目,请使用以下驱动程序之一:

对于作为 SQL Server 数据库引擎组件(版本 2012 到 2019)随附的 SQLNCLI,请参阅此支持生命周期特例

某些 ODBC 函数既可同步操作,也可以异步操作。 应用程序可以为语句句柄或连接句柄启用异步操作。 如果为连接句柄设置了该选项,它将影响连接句柄上的所有语句句柄。 应用程序使用以下语句启用或禁用异步操作:

SQLSetConnectAttr(hdbc, SQL_ATTR_ASYNC_ENABLE,  
                        SQL_ASYNC_ENABLE_ON, SQL_IS_INTEGER);  
SQLSetConnectAttr(hdbc, SQL_ATTR_ASYNC_ENABLE,  
                        SQL_ASYNC_ENABLE_OFF, SQL_IS_INTEGER);  
SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE,  
                        SQL_ASYNC_ENABLE_ON, SQL_IS_INTEGER);  
SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE,  
                        SQL_ASYNC_ENABLE_OFF, SQL_IS_INTEGER);  

当某个应用程序以异步模式调用 ODBC 函数,在得到服务器已完成命令的通知之前,驱动程序不向应用程序返回控制权。

异步操作时,驱动程序立即向应用程序返回控制权,甚至在向服务器发送命令之前也可以。 驱动程序将返回代码设置为 SQL_STILL_EXECUTING。 应用程序随后可执行其他工作。

当应用程序测试命令是否完成时,它会向驱动程序发出带有相同参数的相同函数调用。 如果驱动程序尚未从服务器接收到回复,它将再次返回 SQL_STILL_EXECUTING。 应用程序必须定期测试该命令,直到返回 SQL_STILL_EXECUTING 之外的代码。 当应用程序收到其他任何返回代码(甚至是 SQL_ERROR)后,它可以确定命令是否已完成。

有时某个命令长时间未完成。 如果应用程序需要取消命令而不等待答复,则它可以通过调用 SQLCancel 与未完成的命令相同的语句句柄来执行此操作。 这是唯一应使用 SQLCancel 的时间。 一些程序员在处理完结果集的一部分时使用 SQLCancel ,并希望取消结果集的其余部分。 SQLMoreResultsSQLCloseCursor 应用于取消未完成的结果集的其余部分,而不是 SQLCancel

另请参阅

创建 SQL Server Native Client ODBC 驱动程序应用程序