API 伺服器資料指標
OLE DB、ODBC 和 ADO API 支援將資料指標對應到已執行之 SQL 陳述式的結果集上。Microsoft SQL Server Native Client OLE DB 提供者和 SQL Server Native Client ODBC 驅動程式會使用 API 伺服器資料指標,來實作這些作業。API 伺服器資料指標是在伺服器上實作的資料指標,由 API 資料指標函數管理。當應用程式呼叫 API 資料指標函數時,資料指標作業會由 OLE DB 提供者或 ODBC 驅動程式傳送到伺服器。
在 OLE DB、ODBC 和 ADO 使用 API 伺服端資料指標時,您可使用 API 的函數或方法來:
開啟連接。
設定屬性 (Attribute 或 Properity) 來定義資料指標的特性,供 API 自動對應覆蓋每個結果集之用。
執行一或多個 Transact-SQL 陳述式。
使用 API 函數或方法來擷取結果集中的資料列。
API 資料指標屬性設定為預設值時,SQL Server Native Client OLE DB 提供者和 SQL Server Native Client ODBC 驅動程式會使用預設結果集。雖然技術上 API 會要求資料指標,但預設資料指標特性符合預設結果集的行為。所以 OLE DB provider 和 ODBC 驅動程式會使用預設結果集實作預設資料指標選項,因為這是從伺服端擷取資料列最有效率的方法。使用預設結果集時,應用程式可執行所有的 Transact-SQL 陳述式或批次,但是一個連接僅允許一個進行中的陳述式。也就是說,應用程式必須處理陳述式傳回的所有結果集或將之取消,應用程式才能執行連線上的其他陳述式。
API 資料指標屬性設定為非預設值時,SQL Server Native Client OLE DB 提供者和 SQL Server Native Client ODBC 驅動程式會使用 API 伺服器資料指標來代替預設結果集。每回呼叫擷取資料列的 API 函數時,會產生一個至伺服端的往返作業,以擷取 API 伺服端資料指標的資料列。
API 伺服端資料指標限制
使用 API 伺服端資料指標時,應用程式無法執行以下的陳述式:
SQL Server 在伺服器資料指標中不支援的 Transact-SQL 陳述式。
傳回多筆結果集的批次或預存程序。
包含 COMPUTE、COMPUTE BY、FOR BROWSE 或 INTO 子句的 SELECT 陳述式。
參考遠端預存程序的 EXECUTE 陳述式。
實作 API 伺服端資料指標
SQL Server Native Client OLE DB 提供者和 SQL Server Native Client ODBC 驅動程式會使用這些特殊系統預存程序來通知伺服器有資料指標作業:
sp_cursoropen 定義要與資料指標和資料指標選項建立關聯的 SQL 陳述式,然後擴展資料指標。
sp_cursorfetch 從資料指標提取一個資料列或資料列區塊。
sp_cursorclose 關閉並取消配置資料指標。
sp_cursoroption 用於設定數種資料指標選項。
sp_cursor 用於要求定位更新。
sp_cursorprepare 將與資料指標相關聯的 Transact-SQL 陳述式或批次編譯成一個執行計畫,但是不建立資料指標。
sp_cursorexecute 從 sp_cursorprepare 所建立的執行計畫,建立並擴展資料指標。
sp_cursorunprepare 捨棄 sp_cursorprepare 所建立的執行計畫。
sp_cursorprepexec 為與資料指標相關聯且已提交的 Transact-SQL 陳述式或批次編譯計畫、建立資料指標,並加以擴展。sp_cursorprepexec 結合了 sp_cursorprepare 和 sp_cursorexecute 的行為。
這些系統預存程序將顯示在使用 API 伺服器資料指標之 ADO、OLE DB 和 ODBC 應用程式的 SQL Server Profiler 追蹤內。它們僅供 SQL Server Native Client OLE DB 提供者和 SQL Server Native Client ODBC 驅動程式內部使用。透過使用資料庫 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 預存程序之後,在連接上沒有未完成的結果,所以您可以在單一連接上同時執行多個 Transact-SQL 陳述式,但前提是它們必須都是以 API 伺服器資料指標來執行。
指定 API 伺服端資料指標
以下摘要說明 API 中 API 伺服端資料指標的運作方式:
OLE DB
開啟一個工作階段物件、開啟一個命令物件、並指定命令文字。
設定資料列集屬性,如 DBPROP_OTHERINSERT、DBPROP_OTHERUPDATEDELETE、DBPROP_OWNINSERT、DBPROP_OWNUDPATEDELETE 來控制資料指標行為。
執行命令物件。
擷取結果集中的資料列,使用的方式如 IRowset::GetNextRows、IRowsetLocate::GetRowsAt、IRowsetLocate::GetRowsAtBookmark 和 IRowsetScroll::GetRowsAtRatio。
ODBC
開啟連接並呼叫 SQLAllocHandle 來配置陳述式控制代碼。
呼叫 SQLSetStmtAttr 以設定 SQL_ATTR_CURSOR_TYPE、SQL_ATTR_CONCURRENCY 和 SQL_ATTR_ROW_ARRAY_SIZE 屬性。或者,指定資料指標行為,方法是設定 SQL_ATTR_CURSOR_SCROLLABLE 和 SQL_ATTR_CURSOR_SENSITIVITY 屬性。
使用 SQLExecDirect 或 SQLPrepare 和 SQLExecute,來執行 Transact-SQL 陳述式。
使用 SQLFetch 或 SQLFetchScroll 擷取資料列或資料列區塊。
ADO
定義一個 Connection 物件和一個 Recordset 物件,然後在 Connection 物件執行 Open 方法。
在指定 CursorType 和/或 LockType 參數的 Recordset 物件上執行 Open 方法。
使用 Move、MoveFirst、MoveLast、MoveNext 和 MovePrevious 資料錄集方法擷取資料列。
API 伺服器資料指標和 SET 選項
在 SQL Server 中,如果發出了提取陳述式,且下列任一項會影響計畫的選項發生變更,或索引檢視、計算資料行所需的選項發生變更,則開啟資料指標時,資料指標會使用作用中選項值的快照集。這些值將用於所有後續的擷取作業,而目前內容中的變更會被忽略。
會影響計畫的選項 |
ARITHABORT NUMERIC_ROUNDABORT FORCEPLAN QUOTED_IDENTIFIER ANSI_NULL_DFLT_ON ANSI_WARNINGS ANSI_PADDING ANSI_NULLS CONCAT_NULL_YIELDS_NULL DATEFIRST DATEFORMAT LANGUAGE TEXTSIZE |
索引檢視和計算資料行 |
ANSI_NULLS ANSI_PADDING ANSI_WARNINGS ARITHABORT (在 80 或更低的相容性層級之下) CONCAT_NULL_YIELDS_NULL QUOTED_IDENTIFIER NUMERIC_ROUNDABORT |