Cursori API del server

Le API OLE DB, ODBC e ADO supportano il mapping dei cursori ai set di risultati restituiti da istruzioni SQL. Il provider OLE DB Native Client MicrosoftSQL Server e il driver ODBC Native Client SQL Server eseguono queste operazioni tramite i cursori API del server. Questi cursori sono implementati nel server e vengono gestiti dalle funzioni per i cursori API. Quando l'applicazione chiama le funzioni per i cursori API, il provider OLE DB o il driver ODBC trasmette l'operazione del cursore al server.

Se si utilizza un cursore API del server in OLE DB, ODBC e ADO, le funzioni o i metodi API consentono di eseguire le operazioni seguenti:

  1. Stabilire una connessione.

  2. Impostare gli attributi o le proprietà che definiscono le caratteristiche del cursore per le quali l'API esegue automaticamente il mapping a ogni set di risultati.

  3. Eseguire una o più istruzioni Transact-SQL.

  4. Utilizzare i metodi o le funzioni API per recuperare le righe dei set di risultati.

Se per le proprietà o per gli attributi del cursore API vengono impostati valori predefiniti, il provider OLE DB Native Client SQL Server e il driver ODBC Native Client SQL Server utilizzano i set di risultati predefiniti. Tecnicamente l'API richiede un cursore. Poiché le funzionalità predefinite del cursore corrispondono al comportamento di un set di risultati predefinito, il provider OLE DB e il driver ODBC implementano le opzioni predefinite del cursore utilizzando un set di risultati predefinito perché ciò rappresenta il metodo più efficiente per recuperare righe dal server. Se si utilizzano set di risultati predefiniti, in un'applicazione è possibile eseguire qualsiasi istruzione o batch Transact-SQL, ma in una connessione deve essere presente una sola istruzione in attesa. Ciò significa che un'applicazione deve elaborare o cancellare tutti i set di risultati restituiti da un'istruzione per poter eseguire un'altra istruzione sulla connessione.

Se i valori delle proprietà o degli attributi dei cursori API sono diversi dai valori predefiniti, il provider OLE DB Native Client SQL Server e il driver ODBC Native Client SQL Server utilizzano i cursori API del server anziché i set di risultati predefiniti. Ogni chiamata a una funzione API che consente di recuperare righe genera un round trip al server per il recupero delle righe dal cursore API del server.

Limitazioni dei cursori API del server

Nelle applicazioni in cui sono utilizzati i cursori API del server non è possibile eseguire le istruzioni seguenti:

  • Istruzioni Transact-SQL non supportate da SQL Server nei cursori del server.

  • Batch o stored procedure che restituiscono più set di risultati.

  • Istruzioni SELECT che contengono la clausola COMPUTE, COMPUTE BY, FOR BROWSE o INTO.

  • Istruzioni EXECUTE che fanno riferimento a una stored procedure remota.

Implementazione dei cursori API del server

Per segnalare al server le operazioni del cursore, il provider OLE DB Native Client SQL Server e il driver ODBC Native Client SQL Server utilizzano le seguenti stored procedure di sistema speciali:

  • sp_cursoropen definisce l'istruzione SQL da associare al cursore e le opzioni del cursore, quindi popola il cursore.

  • sp_cursorfetch recupera una riga o un blocco di righe dal cursore.

  • sp_cursorclose chiude il cursore e ne esegue la deallocazione.

  • sp_cursoroption consente di impostare diverse opzioni del cursore.

  • sp_cursor consente di richiedere aggiornamenti posizionati.

  • sp_cursorprepare compila in un piano di esecuzione l'istruzione Transact-SQL o il batch associato a un cursore, senza tuttavia creare il cursore.

  • sp_cursorexecute crea e popola un cursore del piano di esecuzione creato da sp_cursorprepare.

  • sp_cursorunprepare elimina il piano di esecuzione di sp_cursorprepare.

  • sp_cursorprepexec compila un piano di esecuzione per l'istruzione Transact-SQL inviata o per il batch associato a un cursore, crea il cursore e lo popola. sp_cursorprepexec combina le funzionalità di sp_cursorprepare e sp_cursorexecute.

Queste stored procedure di sistema sono disponibili nelle tracce di SQL Server Profiler delle applicazioni ADO, OLE DB e ODBC in cui sono in uso i cursori API del server Sono destinate esclusivamente all'utilizzo interno del provider OLE DB Native Client SQL Server e del driver ODBC Native Client SQL Server. La funzionalità completa di queste procedure viene esposta nelle applicazioni tramite le funzionalità del cursore delle API di database. Non è possibile specificare le procedure direttamente in un'applicazione.

Se in SQL Server viene eseguita un'istruzione per una connessione specifica, su tale connessione è possibile eseguire altre istruzioni solo dopo che i risultati della prima istruzione sono stati elaborati o cancellati. La stessa regola è inoltre valida per l'utilizzo dei cursori API del server, ma nell'applicazione tale regola viene interpretata come l'inizio del supporto di più istruzioni attive su una connessione da parte di SQL Server. Ciò dipende dal fatto che il set di risultati completo è archiviato nel cursore del server e le uniche istruzioni inviate a SQL Server sono quelle relative all'esecuzione delle stored procedure di sistema sp_cursor. SQL Server esegue la stored procedure e può eseguirne un'altra non appena il client ha recuperato il set di risultati. Il provider OLE DB e il driver ODBC recuperano sempre tutti i risultati di una stored procedure sp_cursor prima di restituire il controllo all'applicazione. In questo modo le applicazioni possono eseguire le operazioni di recupero su più cursori del server attivi.

Nella tabella seguente viene descritta la procedura per l'elaborazione simultanea di due cursori in una connessione tramite l'utilizzo di due handle di istruzione.

Handle di istruzione 1

Handle di istruzione 2

Imposta gli attributi del cursore in modo che venga utilizzato un cursore API del server.

 

Viene eseguita SQLExecDirect per un'istruzione SQL. Il driver ODBC chiama sp_cursoropen e recupera il set di risultati restituito dalla procedura.

 

 

Imposta gli attributi del cursore in modo che venga utilizzato un cursore API del server.

 

Viene eseguita SQLExecDirect per un'istruzione SQL. Il driver ODBC chiama sp_cursoropen e recupera il set di risultati restituito dalla procedura.

Viene eseguita SQLFetchScroll per recuperare il primo blocco di righe. Il driver richiama sp_cursorfetch e recupera il set di risultati restituito dalla procedura.

 

 

Viene eseguita SQLFetchScroll per recuperare il primo blocco di righe. Il driver richiama sp_cursorfetch e recupera il set di risultati restituito dalla procedura.

Viene eseguita SQLFetchScroll per recuperare un altro blocco di righe. Il driver chiama sp_cursorfetch e recupera il set di risultati restituito dalla procedura.

 

 

Viene eseguita SQLFetchScroll per recuperare un altro blocco di righe. Il driver chiama sp_cursorfetch e recupera il set di risultati restituito dalla procedura.

Viene chiamata SQLFreeStmt o SQLCloseCursor. Il driver chiama sp_cursorclose.

 

 

Viene chiamata SQLFreeStmt o SQLCloseCursor. Il driver chiama sp_cursorclose.

Dato che dopo una chiamata a una stored procedure sp_cursor nella connessione non risulta in attesa alcun risultato, è possibile eseguire simultaneamente più istruzioni Transact-SQL in una singola connessione, a condizione che le istruzioni vengano eseguite con cursori API del server.

Configurazione dei cursori API del server

Di seguito viene riepilogata la procedura per l'utilizzo dei cursori API del server nelle API:

  • OLE DB

    • Aprire un oggetto di sessione, quindi un oggetto Command e specificare il testo del comando.

    • Impostare le proprietà dei set di righe, ad esempio DBPROP_OTHERINSERT, DBPROP_OTHERUPDATEDELETE, DBPROP_OWNINSERT e DBPROP_OWNUDPATEDELETE, per controllare le funzionalità del cursore.

    • Eseguire l'oggetto Command.

    • Recuperare le righe del set di risultati tramite i metodi IRowset::GetNextRows, IRowsetLocate::GetRowsAt, IRowsetLocate::GetRowsAtBookmark e IRowsetScroll::GetRowsAtRatio.

  • ODBC

    • Stabilire una connessione e chiamare SQLAllocHandle per allocare gli handle di istruzione.

    • Chiamare SQLSetStmtAttr per impostare gli attributi SQL_ATTR_CURSOR_TYPE, SQL_ATTR_CONCURRENCY e SQL_ATTR_ROW_ARRAY_SIZE. In alternativa, è possibile specificare le funzionalità del cursore impostando gli attributi SQL_ATTR_CURSOR_SCROLLABLE e SQL_ATTR_CURSOR_SENSITIVITY.

    • Eseguire un'istruzione Transact-SQL utilizzando SQLExecDirect o SQLPrepare e SQLExecute.

    • Recuperare le righe o i blocchi di righe tramite SQLFetch o SQLFetchScroll.

  • ADO

    • Definire un oggetto Connection e un oggetto Recordset, quindi eseguire il metodo Open dell'oggetto Connection.

    • Eseguire il metodo Open dell'oggetto Recordset specificando il parametro CursorType e/o LockType.

    • Recuperare le righe mediante i metodi di recordset Move, MoveFirst, MoveLast, MoveNext e MovePrevious.

Cursori API del server e opzioni SET

In SQL Server, se viene eseguita un'operazione di recupero e viene modificata una delle opzioni che influiscono sul piano di esecuzione o una delle opzioni necessarie per le viste indicizzate o le colonne calcolate, il cursore utilizza uno snapshot dei valori dell'opzione attivi all'apertura del cursore. Tali valori vengono utilizzati per tutte le operazioni di recupero successive e le modifiche nel contesto corrente verranno ignorate.

Opzioni che influiscono sul piano

ARITHABORT

NUMERIC_ROUNDABORT

FORCEPLAN

QUOTED_IDENTIFIER

ANSI_NULL_DFLT_ON

ANSI_WARNINGS

ANSI_PADDING

ANSI_NULLS

CONCAT_NULL_YIELDS_NULL

DATEFIRST

DATEFORMAT

LANGUAGE

TEXTSIZE

Viste indicizzate e colonne calcolate

ANSI_NULLS

ANSI_PADDING

ANSI_WARNINGS

ARITHABORT (con livello di compatibilità 80 o inferiore) CONCAT_NULL_YIELDS_NULL

QUOTED_IDENTIFIER

NUMERIC_ROUNDABORT