Condividi tramite


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.

Vedere anche

Esecuzione di query (ODBC)