OLE DB、ODBC、ADO 和 DB-Library API 支持将游标映射至已执行 SQL 语句的结果集。Microsoft® SQL Server™ OLE DB 提供程序、SQL Server ODBC 驱动程序和 DB-Library 动态链接库 (DLL) 通过使用 API 服务器游标执行这些操作。API 服务器游标在服务器上实现,并由 API 游标函数进行管理。当应用程序调用 API 游标函数时,游标操作由 OLE DB 提供程序、ODBC 驱动程序或 DB-Library DLL 传递给服务器。
当在 OLE DB、ODBC 和 ADO 中使用 API 服务器游标时,使用 API 函数和方法实现如下功能:
在 DB-Library 中,与 API 服务器游标一起使用特殊的 DB-Library 游标库函数。
当 API 游标特性或属性设为其默认值时,SQL Server OLE DB 提供程序和 SQL Server ODBC 驱动程序使用默认结果集。虽然从技术上说 API 要求游标,但默认游标特征与默认结果集的行为是匹配的。因此,OLE DB 提供程序和 ODBC 驱动程序利用默认结果集实现默认游标选项,这是从服务器中检索行最有效的方法。使用默认结果集时,应用程序可执行任何 Transact-SQL 语句和批处理,但是它在一个连接中只能有一个未完成的语句。这意味着在连接上执行下一个语句之前,应用程序必须处理或者取消由一个语句返回的所有结果集。
当 API 游标特性或属性没有按默认值进行设置时,SQL Server OLE DB 提供程序和 SQL Server ODBC 驱动程序将使用 API 服务器游标代替默认结果集。每次对提取行的 API 函数的调用都会产生到服务器的一次往返,以从 API 服务器游标中提取行。
DB-Library 应用程序使用 DB-Library 游标库函数请求游标。如果 DBCLIENTCURSOR 没有设置,那么 DB-Library 游标库函数将采用与 SQL Server OLE DB 提供程序和 SQL Server ODBC 驱动程序相同的方法来使用 API 服务器游标。
使用 API 服务器游标时,应用程序不能执行下列语句:
SQL Server OLE DB 提供程序、SQL Server ODBC 驱动程序和 DB-Library DLL 使用这些特殊的系统存储过程向服务器示意游标操作。
这些系统存储过程将在使用 API 服务器游标的 ADO、OLE DB、ODBC 和 DB-Library 应用程序的 SQL Server 事件探查器跟踪中显示。这些记录仅供 SQL Server OLE DB 提供程序、SQL Server ODBC 驱动程序和 DB-Library DLL 内部使用。应用程序可通过数据库 API 的游标功能来使用这些过程的完整功能。在应用程序中直接指定过程的做法不受支持。
当 SQL Server 在某连接上执行语句时,只有在来自第一个语句的所有结果处理完毕或被取消时,才能在连接上执行其它语句。在使用 API 服务器游标时,这个规则仍然成立,但是从应用程序的角度来看,好象 SQL Server 在一个连接上已经开始支持多个活动语句。这是因为完整的结果集存储在服务器游标中,而仅有的传递给 SQL Server 的语句是对 sp_cursor 系统存储过程的执行。SQL Server 执行这些存储过程,且一旦客户端检索该结果集,它就可以开始执行其它语句。OLE DB 提供程序和 ODBC 驱动程序则在把控制返回给应用程序之前始终检索来自 sp_cursor 存储过程的所有结果集。这使应用程序可以插空在多级活动服务器游标中进行提取操作。
下表说明了应用程序如何利用两个语句句柄在一个连接上同时处理两个游标。
| 语句句柄 1 | 语句句柄 2 |
|---|---|
| 将游标特性设置可使用 API 服务器游标。 | |
| SQLExecDirect 一个 SQL 语句。ODBC 驱动程序调用 sp_cursoropen,然后检索该过程所返回的结果集。 | |
| 将游标特性设置可使用 API 服务器游标。 | |
| SQLExecDirect 一个 SQL 语句。ODBC 驱动程序调用 sp_cursoropen,然后检索该过程所返回的结果集。 | |
| SQLFetchScroll 检索第一个行块。驱动程序调用 sp_cursorfetch,然后检索该过程所返回的结果集。 | |
| SQLFetchScroll 检索第一个行块。驱动程序调用 sp_cursorfetch,然后检索该过程所返回的结果集。 | |
| SQLFetchScroll 以检索另一行块。驱动程序调用 sp_cursorfetch,然后检索该过程所返回的结果集。 | |
| SQLFetchScroll 以检索另一行块。驱动程序调用 sp_cursorfetch,然后检索该过程所返回的结果集。 | |
| 调用 SQLFreeStmt 或 SQLCloseCursor。驱动程序调用 sp_cursorclose。 | |
| 调用 SQLFreeStmt 或 SQLCloseCursor。驱动程序调用 sp_cursorclose。 |
由于在所有 sp_cursor 存储过程的调用之后连接中不再留有未决结果,那么在假设全部使用 API 服务器游标执行的前提下,就可以在单个连接上并行执行多个 Transact-SQL 语句。
下面是有关在 API 中如何使用 API 服务器游标的摘要:
通过 ADO 使用游标
行集和 SQL Server 游标
使用游标
游标函数