Costruzione di istruzioni SQL per i cursori
Il driver ODBC di SQL Server Native Client utilizza cursori server per implementare la funzionalità del cursore definita nella specifica di ODBC. In un'applicazione ODBC è possibile controllare il comportamento del cursore utilizzando SQLSetStmtAttr per impostare attributi di istruzione diversi. Di seguito sono indicati gli attributi e le rispettive impostazioni predefinite.
Attributo |
Impostazione predefinita |
---|---|
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 |
Se quando viene eseguita un'istruzione SQL l'impostazione di queste opzioni è quella predefinita, il driver ODBC di SQL Server Native Client non utilizza un cursore server per implementare il set di risultati. Utilizza, invece, un set di risultati predefinito. Se quando viene eseguita un'istruzione SQL viene cambiata l'impostazione predefinita di una di queste opzioni, il driver ODBC di SQL Server Native Client prova a utilizzare un cursore 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 server non supportano tutte le istruzioni Transact-SQL e 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 generate 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 che contengono le parole chiave COMPUTE, COMPUTE BY, FOR BROWSE o INTO.
Se in SQL Server un'istruzione SQL che corrisponde a una di queste condizioni viene eseguita con un cursore server, il cursore server viene convertito implicitamente in un set di risultati predefinito. Dopo che SQLExecDirect o SQLExecute restituisce SQL_SUCCESS_WITH_INFO, verranno nuovamente impostati i valori predefiniti per gli attributi del cursore.
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.
Errori
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 del cursore correnti.
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.
Un tentativo di eseguire un'istruzione SELECT contenente una clausola COMPUTE quando l'utilizzo di cursori server genera l'errore seguente:
SqlState: 42000
pfNative: 16907
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
'COMPUTE' is not allowed in cursor statements.
Le applicazioni ODBC che ricevono questi errori devono reimpostare tutti gli attributi di istruzione di cursore sui valori predefiniti prima di tentare di eseguire l'istruzione.