Scrittura di applicazioni ODBC 3. x

Quando un'applicazione ODBC 2.x viene aggiornata a ODBC 3.x, deve essere scritta in modo che funzioni con entrambi i driver ODBC 2.x e 3.x . L'applicazione deve incorporare il codice di condizione per sfruttare appieno le funzionalità di ODBC 3.x .

L'attributo dell'ambiente SQL_ATTR_ODBC_VERSION deve essere impostato su SQL_OV_ODBC2. In questo modo il driver si comporta come un driver ODBC 2.x rispetto alle modifiche descritte nella sezione Modifiche funzionali.

Se l'applicazione userà una delle funzionalità descritte nella sezione Nuove funzionalità, è necessario usare il codice di condizione per determinare se il driver è un driver ODBC 3.x o ODBC 2.x . L'applicazione usa SQLGetDiagField e SQLGetDiagRec per ottenere SQLSTATEs ODBC 3.x durante l'elaborazione degli errori in questi frammenti di codice di condizione. È necessario considerare i seguenti punti relativi alla nuova funzionalità:

  • Un'applicazione interessata dalla modifica del comportamento delle dimensioni del set di righe deve prestare attenzione a non chiamare SQLFetch quando la dimensione della matrice è maggiore di 1. Queste applicazioni devono sostituire le chiamate a SQLExtendedFetch con chiamate a SQLSetStmtAttr per impostare l'attributo dell'istruzione SQL_ATTR_ARRAY_STATUS_PTR e su SQLFetchScroll, in modo che abbiano codice comune che funziona con i driver ODBC 3.x e ODBC 2.x . Poiché SQLSetStmtAttr con SQL_ATTR_ROW_ARRAY_SIZE verrà mappato a SQLSetStmtAttr con SQL_ROWSET_SIZE per i driver ODBC 2.x, le applicazioni possono semplicemente impostare SQL_ATTR_ROW_ARRAY_SIZE per le operazioni di recupero a riga multipla.

  • La maggior parte delle applicazioni che aggiornano non sono effettivamente interessate dalle modifiche apportate ai codici SQLSTATE. Per le applicazioni interessate, è possibile eseguire una ricerca meccanica e una sostituzione utilizzando la tabella di conversione degli errori nella sezione "Mapping SQLSTATE" per convertire i codici di errore ODBC 3.x in codici ODBC 2.x . Poiché Gestione driver ODBC 3.x eseguirà il mapping da SQLSTATEs ODBC 2.x a SQLSTATEs ODBC 3.x, questi writer di applicazioni devono solo verificare la presenza di SQLSTATEs ODBC 3.x e non preoccuparsi di includere SQLSTATEs ODBC 2.x nel codice di condizione.

  • Se un'applicazione usa in modo ottimale i tipi di dati data, ora e timestamp, può dichiararsi come un'applicazione ODBC 2.x e usare il codice esistente anziché usare il codice di condizione.

L'aggiornamento deve includere anche i passaggi seguenti:

  • Chiamare SQLSetEnvAttr prima di allocare una connessione per impostare l'attributo di ambiente SQL_ATTR_ODBC_VERSION su SQL_OV_ODBC2.

  • Sostituire tutte le chiamate a SQLAllocEnv, SQLAllocConnect o SQLAllocStmt con chiamate a SQLAllocHandle con l'argomento HandleType appropriato di SQL_HANDLE_ENV, SQL_HANDLE_DBC o SQL_HANDLE_STMT.

  • Sostituire tutte le chiamate a SQLFreeEnv o SQLFreeConnectcon chiamate a SQLFreeHandle con l'argomento HandleType appropriato di SQL_HANDLE_DBC o SQL_HANDLE_STMT.

  • Sostituire tutte le chiamate a SQLSetConnectOption con le chiamate a SQLSetConnectAttr. Se si imposta un attributo il cui valore è una stringa, impostare l'argomento StringLength in modo appropriato. Modificare l'argomento Attributo da SQL_XXXX a SQL_ATTR_XXXX.

  • Sostituire tutte le chiamate a SQLGetCOnnectOption con chiamate a SQLGetConnectAttr. Se si ottiene un attributo stringa o binario, impostare BufferLength sul valore appropriato e passare un argomento StringLength . Modificare l'argomento Attributo da SQL_XXXX a SQL_ATTR_XXXX.

  • Sostituire tutte le chiamate a SQLSetStmtOption con chiamate a SQLSetStmtAttr. Se si imposta un attributo il cui valore è una stringa, impostare l'argomento StringLength in modo appropriato. Modificare l'argomento Attributo da SQL_XXXX a SQL_ATTR_XXXX.

  • Sostituire tutte le chiamate a SQLGetStmtOption con le chiamate a SQLGetStmtAttr. Se si ottiene un attributo stringa o binario, impostare BufferLength sul valore appropriato e passare un argomento StringLength . Modificare l'argomento Attributo da SQL_XXXX a SQL_ATTR_XXXX.

  • Sostituire tutte le chiamate a SQLTransact con chiamate a SQLEndTran. Se l'handle valido più a destra nella chiamata SQLTransact è un handle di ambiente, è necessario usare un argomento HandleType di SQL_HANDLE_ENV nella chiamata SQLEndTran con l'argomento Handle appropriato. Se l'handle valido più a destra nella chiamata SQLTransact è un handle di connessione, è necessario usare un argomento HandleType di SQL_HANDLE_DBC nella chiamata SQLEndTran con l'argomento Handle appropriato.

  • Sostituire tutte le chiamate a SQLColAttributes con chiamate a SQLColAttribute. Se l'argomento FieldIdentifier è SQL_COLUMN_PRECISION, SQL_COLUMN_SCALE o SQL_COLUMN_LENGTH, nnon modificare nulla oltre al nome della funzione. In caso contrario, impostare FieldIdentifier da SQL_COLUMN_XXXX a SQL_DESC_XXXX. Se FieldIdentifier è SQL_DESC_CONCISE_TYPE e il tipo di dati è un tipo di dati datetime, passare al tipo di dati ODBC 3.x corrispondente.

  • Se si usano cursori a blocchi, cursori scorrevoli o entrambi, l'applicazione esegue le operazioni seguenti:

    • Imposta le dimensioni del set di righe, il tipo di cursore e la concorrenza del cursore usando SQLSetStmtAttr.

    • Chiama SQLSetStmtAttr per impostare SQL_ATTR_ROW_STATUS_PTR in modo che punti a una matrice di record di stato.

    • Chiama SQLSetStmtAttr per impostare SQL_ATTR_ROWS_FETCHED_PTR in modo che punti a SQLINTEGER.

    • Esegue le associazioni necessarie ed esegue l'istruzione SQL.

    • Chiama SQLFetchScroll in un loop per recuperare le righe e spostarsi nel set di risultati.

    • Se si desidera recuperare in base al segnalibro, l'applicazione chiama SQLSetStmtAttr per impostare SQL_ATTR_FETCH_BOOKMARK_PTR su una variabile che conterrà il segnalibro per la riga da recuperare e chiama SQLFetchScroll con un argomento FetchOrientation di SQL_FETCH_BOOKMARK.

  • Se si usano matrici di parametri, l'applicazione esegue le operazioni seguenti:

    • Chiama SQLSetStmtAttr per impostare l'attributo SQL_ATTR_PARAMSET_SIZE sulle dimensioni della matrice di parametri.

    • Chiama SQLSetStmtAttr per impostare SQL_ATTR_ROWS_PROCESSED_PTR in modo che punti a una variabile UDWORD interna.

    • Esegue operazioni di preparazione, associazione ed esecuzione in base alle esigenze.

    • Se l'esecuzione si arresta per qualche motivo (ad esempio SQL_NEED_DATA), può trovare la riga "corrente" dei parametri ispezionando la posizione indicata da SQL_ATTR_ROWS_PROCESSED_PTR.

Questa sezione descrive gli argomenti seguenti: