Costruzione di istruzioni SQL per i cursori
Il driver ODBC SQL Server Native Client utilizza cursori server per implementare la funzionalità del cursore definita nella specifica ODBC. Un'applicazione ODBC controlla il comportamento del cursore usando SQLSetStmtAttr per impostare attributi di istruzione diversi. Di seguito sono indicati gli attributi e le rispettive impostazioni predefinite.
Attributo | Predefinito |
---|---|
SQL_ATTR_CONCURRENCY | SQL_CONCUR_READ_ONLY |
SQL_ATTR_CURSOR_TYPE | SQL_CURSOR_FORWARD_ONLY |
SQL_ATTR_CURSOR_SCROLLABLE | SQL_NONSCROLLABLE |
SQL_ATTR_CURSOR_SENSITIVITY | SQL_UNSPECIFIED |
SQL_ATTR_ROW_ARRAY_SIZE | 1 |
Quando queste opzioni sono impostate sulle impostazioni predefinite al momento dell'esecuzione di un'istruzione SQL, il driver ODBC SQL Server Native Client non usa un cursore server per implementare il set di risultati, ma usa un set di risultati predefinito. Se una di queste opzioni viene modificata rispetto alle impostazioni predefinite al momento dell'esecuzione di un'istruzione SQL, il driver ODBC SQL Server Native Client tenta di usare un cursore del server per implementare il set di risultati.
I set di risultati predefiniti supportano tutte le istruzioni Transact-SQL. Non sono presenti restrizioni sui tipi di istruzioni SQL che è possibile eseguire quando si utilizza un set di risultati predefinito.
I cursori del server non supportano tutte le istruzioni Transact-SQL. non supportano un'istruzione SQL che genera più set di risultati.
Di seguito sono indicati i tipi di istruzioni non supportati dai cursori server:
Batch
Istruzioni SQL compilate da due o più istruzioni SQL SELECT singole, ad esempio:
SELECT * FROM Authors; SELECT * FROM Titles
Stored procedure con più istruzioni SELECT
Istruzioni SQL che eseguono una stored procedure che contiene più di un'istruzione SELECT. Sono incluse le istruzioni SELECT che vengono inserite in parametri o variabili.
Parole chiave
Istruzioni SQL contenenti le parole chiave FOR BROWSE o INTO.
In SQL Server, se un'istruzione SQL corrispondente a una di queste condizioni viene eseguita con un cursore server, il cursore del server viene convertito in modo implicito in un set di risultati predefinito. Dopo che SQLExecDirect o SQLExecute restituisce SQL_SUCCESS_WITH_INFO, gli attributi del cursore verranno impostati di nuovo sulle impostazioni predefinite.
Le istruzioni SQL che non rientrano nelle categorie sopra riportate possono essere eseguite con qualsiasi impostazione degli attributi di istruzione. Il funzionamento è identico con un set di risultati predefinito o con un cursore server.
Errors
In SQL Server 7.0 e versioni successive, un tentativo di eseguire un'istruzione che produce più set di risultati genera SQL_SUCCESS_WITH INFO e il messaggio seguente:
SqlState: 01S02"
pfNative: 0
szErrorMsgString: "[Microsoft][SQL Server Native Client][SQL Server]
Cursor type changed."
Le applicazioni ODBC che ricevono questo messaggio possono chiamare SQLGetStmtAttr per determinare le impostazioni correnti del cursore.
Un tentativo di eseguire una procedura con più istruzioni SELECT quando si utilizzano cursori server genera l'errore seguente:
SqlState: 42000
pfNative: 16937
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
A server cursor is not allowed on a stored procedure
with more than one SELECT statement in it. Use a
default result set or client cursor.
Un tentativo di eseguire un batch con più istruzioni SELECT quando l'utilizzo di cursori server genera l'errore seguente:
SqlState: 42000
pfNative: 16938
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
sp_cursoropen. The statement parameter can only
be a single SELECT statement or a single stored
procedure.
Nelle applicazioni ODBC che ricevono questi errori devono essere reimpostati tutti gli attributi di istruzione di cursore sui valori predefiniti prima di tentare di eseguire l'istruzione.