异步模式和 SQLCancel
某些 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。SQLMoreResults 或 SQLCloseCursor 应用于取消未完成结果集的其余部分,而非使用 SQLCancel。