Condividi tramite


Mapping di funzioni di sostituzione per la compatibilità con le versioni precedenti delle applicazioni

Un'applicazione ODBC 3.x che lavora attraverso Gestione driver ODBC 3.x funzionerà con un driver ODBC 2.x purché non vengano usate nuove funzionalità. Sia le funzionalità duplicate che le modifiche funzionali, tuttavia, influiscono sul funzionamento dell'applicazione ODBC 3.x su un driver ODBC 2.x. Quando si utilizza un driver ODBC 2.x, Gestione driver esegue il mapping delle funzioni ODBC 3.x seguenti, che hanno sostituito una o più funzioni ODBC 2.x, nelle funzioni ODBC 2.x corrispondenti.

Funzione ODBC 3.x Funzione ODBC 2.x
SQLAllocHandle SQLAllocEnv, SQLAllocConnect o SQLAllocStmt
SQLBulkOperations SQLSetPos
SQLColAttribute SQLColAttributes
SQLEndTran SQLTransact
SQLFetch SQLExtendedFetch
SQLFetchScroll SQLExtendedFetch
SQLFreeHandle SQLFreeEnv, SQLFreeConnect o SQLFreeStmt
SQLGetConnectAttr SQLGetConnectOption
SQLGetDiagRec SQLError
SQLGetStmtAttr SQLGetStmtOption[1]
SQLSetConnectAttr SQLSetConnectOption
SQLSetStmtAttr SQLSetStmtOption[1]

[1] È anche possibile eseguire altre azioni, a seconda dell'attributo richiesto.

SQLAllocHandle

Gestione driver esegue il mapping su SQLAllocEnv, SQLAllocConnect o SQLAllocStmt, in base alle esigenze. La chiamata seguente a SQLAllocHandle:

SQLAllocHandle(HandleType, InputHandle, OutputHandlePtr);  

farà sì che il Driver Manager esegua la seguente mappatura (concettuale, senza controllo degli errori):

switch (HandleType) {  
   case SQL_HANDLE_ENV: return (SQLAllocEnv(OutputHandlePtr));  
   case SQL_HANDLE_DBC: return (SQLAllocConnect (InputHandle, OutputHandlePtr));  
   case SQL_HANDLE_STMT: return (SQLAllocStmt (InputHandle, OutputHandlePtr));  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLBulkOperations

Gestione driver esegue il mapping a SQLSetPos. La chiamata seguente a SQLBulkOperations:

SQLBulkOperations(hstmt, Operation);  

darà luogo alla sequenza di passaggi seguente:

  1. Se l'argomento dell’operazione è SQL_ADD, Gestione driver chiama SQLSetPos come indicato di seguito:

    SQLSetPos (hstmt, 0, SQL_ADD, SQL_LOCK_NO_CHANGE);  
    
  2. Se l'argomento dell’operazione non è SQL_ADD, il driver restituisce SQLSTATE HY092 (identificatore di attributo/opzione non valido).

  3. Se l'applicazione tenta di modificare il SQL_ATTR_ROW_STATUS_PTR tra le chiamate a SQLFetch o SQLFetchScroll e SQLBulkOperations, Gestione driver restituirà SQLSTATE HY011 (l'attributo non può essere impostato ora).

  4. Se l'argomento dell’operazione è SQL_ADD, l'applicazione deve chiamare SQLBindCol per associare i dati da inserire. Non è possibile chiamare SQLSetDescField o SQLSetDescRec per associare i dati da inserire.

  5. Se l'argomento dell’operazione è SQL_ADD e il numero di righe da inserire non corrisponde alla dimensione corrente del set di righe, è necessario chiamare SQLSetStmtAttr per impostare l'attributo dell'istruzione SQL_ATTR_ROW_ARRAY_SIZE sul numero di righe da inserire prima di chiamare SQLBulkOperations. Per ripristinare le dimensioni del set di righe precedente, l'applicazione deve impostare l'attributo dell'istruzione SQL_ATTR_ROW_ARRAY_SIZE prima di chiamare SQLFetch, SQLFetchScroll o SQLSetPos.

SQLColAttribute

Gestione driver esegue il mapping a SQLColAttributes. La chiamata seguente a SQLColAttribute:

SQLColAttribute(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);  

darà luogo alla sequenza di passaggi seguente:

  1. Se FieldIdentifier è uno dei seguenti:

    SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_LENGTH, SQL_DESC_OCTET_LENGTH, SQL_DESC_UNNAMED, SQL_DESC_BASE_COLUMN_NAME, SQL_DESC_LITERAL_PREFIX, SQL_DESC_LITERAL_SUFFIX o SQL_DESC_LOCAL_TYPE_NAME

    Gestione driver restituisce SQL_ERROR con SQLSTATE HY091 (identificatore di campo del descrittore non valido). Non si applicano altre regole di questa sezione.

  2. Gestione driver esegue rispettivamente il mapping di SQL_COLUMN_COUNT, SQL_COLUMN_NAME, or SQL_COLUMN_NULLABLE to SQL_DESC_COUNT, SQL_DESC_NAME, or SQL_DESC_NULLABLE. (Un driver ODBC 2.x deve supportare solo SQL_COLUMN_COUNT, SQL_COLUMN_NAME e SQL_COLUMN_NULLABLE, non SQL_DESC_COUNT, SQL_DESC_NAME e SQL_DESC_NULLABLE). Viene eseguito il mapping della chiamata a SQLColAttribute su:

    SQLColAttributes(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);  
    
  3. Tutti gli altri valori di FieldIdentifier vengono passati al driver, con SQLColAttribute mappato su SQLColAttributes come illustrato in precedenza.

  4. Se BufferLength è minore di 0, Gestione driver restituisce SQL_ERROR con SQLSTATE HY090 (stringa o lunghezza buffer non valida). Non si applicano altre regole di questa sezione.

  5. Se FieldIdentifier è SQL_DESC_CONCISE_TYPE e il tipo restituito è un tipo di dati datetime conciso, Gestione driver esegue il mapping dei valori restituiti per i codici data e ora.

  6. Gestione driver esegue i controlli necessari per verificare se deve essere generato SQLSTATE HY010 (errore della sequenza di funzioni). In tal caso, Gestione driver restituisce SQL_ERROR e SQLSTATE HY010 (errore della sequenza di funzioni). Non si applicano altre regole di questa sezione.

SQLEndTran

Gestione driver esegue il mapping su SQLTransact. La chiamata seguente a SQLEndTran:

SQLEndTran(HandleType, Handle, CompletionType);  

farà sì che il Driver Manager esegua la seguente mappatura (concettuale, senza controllo degli errori):

switch (HandleType) {  
   case SQL_HANDLE_ENV:return(SQLTransact(Handle, SQL_NULL_HDBC, CompletionType));  
   case SQL_HANDLE_DBC:return(SQLTransact(SQL_NULL_HENV, Handle, CompletionType);  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLFetch

Gestione driver esegue il mapping di SQLExtendedFetch con un argomento FetchOrientation di SQL_FETCH_NEXT. La chiamata seguente a SQLFetch:

SQLFetch (StatementHandle);  

farà sì che Gestione driver chiami SQLExtendedFetch, come indicato di seguito:

rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, &RowCount, RowStatusArray);  

In questa chiamata, l'argomento pcRow viene impostato sul valore su cui l'applicazione imposta l'attributo dell'istruzione SQL_ATTR_ROWS_FETCHED_PTR tramite una chiamata a SQLSetStmtAttr.

Nota

Quando l'applicazione chiama SQLSetStmtAttr per impostare SQL_ATTR_ROW_STATUS_PTR in modo che punti a una matrice di stato, Gestione driver memorizza nella cache il puntatore. RowStatusArray può essere uguale a un puntatore Null.

Se il driver non supporta SQLExtendedFetch e viene caricata la libreria di cursori, Gestione driver usa SQLExtendedFetch della libreria di cursori per eseguire il mapping di SQLFetch a SQLExtendedFetch. Se il driver non supporta SQLExtendedFetch e la libreria di cursori non viene caricata, Gestione driver passa la chiamata a SQLFetch al driver. Se l'applicazione chiama SQLSetStmtAttr per impostare SQL_ATTR_ROW_STATUS_PTR, Gestione driver garantisce che la matrice venga popolata. Se l'applicazione chiama SQLSetStmtAttr per impostare SQL_ATTR_ROWS_FETCHED_PTR, Gestione driver imposta questo campo su 1.

SQLFetchScroll

Gestione driver esegue il mapping a SQLExtendedFetch. La chiamata seguente a SQLFetchScroll:

SQLFetchScroll(StatementHandle, FetchOrientation, FetchOffset);  

darà luogo alla sequenza di passaggi seguente:

  1. Quando l'applicazione chiama SQLSetStmtAttr per impostare SQL_ATTR_ROW_STATUS_PTR (che imposta il campo SQL_DESC_ARRAY_STATUS_PTR in IRD) in modo che punti a una matrice di stato, Gestione driver memorizza questo puntatore nella cache. Lasciare che il puntatore sia RowStatusArray. In caso contrario, lasciare che RowStatusArray sia uguale a un puntatore Null. Se l'argomento RowStatusArray è impostato su un puntatore Null, Gestione driver genera una matrice di stato di riga.

  2. Se FetchOrientation non è uno dei SQL_FETCH_NEXT, SQL_FETCH_PRIOR, SQL_FETCH_ABSOLUTE, SQL_FETCH_RELATIVE, SQL_FETCH_FIRST, SQL_FETCH_LAST o SQL_FETCH_BOOKMARK, Gestione driver restituisce con SQL_ERROR e SQLSTATE HY106 (tipo di recupero non compreso nell'intervallo). Non si applicano altre regole di questa sezione.

  3. Maiuscole/minuscole:

  • Se FetchOrientation è uguale a SQL_FETCH_BOOKMARK, allora:

    • Se SQLSetStmtAttr è stato chiamato in precedenza per impostare il valore di SQL_ATTR_FETCH_BOOKMARK_PTR, lascia che Bmk sia il valore ottenuto dereferenziando il puntatore SQL_DESC_FETCH_BOOKMARK_PTR.

    • In caso contrario, restituisce SQL_ERROR con SQLSTATE HY111 (valore segnalibro non valido). Non si applicano altre regole di questa sezione.

    Gestione driver chiama ora SQLExtendedFetch, come indicato di seguito:

    rc = SQLExtendedFetch(StatementHandle, FetchOrientation, Bmk, pcRow, RowStatusArray);  
    
  • In caso contrario, Gestione driver chiama SQLExtendedFetch, come indicato di seguito:

    rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, pcRow, RowStatusArray);  
    

    In queste chiamate, l'argomento pcRow è impostato sul valore a cui l'applicazione imposta l'attributo SQL_ATTR_ROWS_FETCHED_PTR attraverso una chiamata a SQLSetStmtAttr.

  • SQL_ATTR_ROW_ARRAY_SIZE viene eseguito il mapping a SQL_ROW SET_SIZE.

  • Se rc è uguale a SQL_SUCCESS o SQL_SUCCESS_WITH_INFO e se FetchOrientation è uguale a SQL_FETCH_BOOKMARK e FetchOffset non è uguale a 0, Gestione driver invia un avviso, SQLSTATE 01S10 (Tentativo di recupero da un offset di segnalibro, valore di offset ignorato) e restituisce SQL_SUCCESS_WITH_INFO.

SQLFreeHandle

Gestione driver esegue il mapping a SQLFreeEnv, SQLFreeConnect o SQLFreeStmt in base alle esigenze. La chiamata seguente a SQLFreeHandle:

SQLFreeHandle(HandleType, Handle);  

farà sì che il Driver Manager esegua la seguente mappatura (concettuale, senza controllo degli errori):

switch (HandleType) {  
   case SQL_HANDLE_ENV: return (SQLFreeEnv(Handle));  
   case SQL_HANDLE_DBC: return (SQLFreeConnect(Handle));  
   case SQL_HANDLE_STMT: return (SQLFreeStmt(Handle, SQL_DROP));  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLGetConnectAttr

Gestione driver esegue il mapping a SQLGetConnectOption. La chiamata seguente a SQLGetConnectAttr:

SQLGetConnectAttr(ConnectionHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);  

darà luogo alla sequenza di passaggi seguente:

  1. Se Attribute non è un attributo di connessione o istruzione definito dal driver e non è un attributo definito in ODBC 2.x, Gestione driver restituisce SQL_ERROR con SQLSTATE HY092 (identificatore di attributo/opzione non valido). Non si applicano altre regole in questa sezione.

  2. Se Attribute è uguale a SQL_ATTR_AUTO_IPD o SQL_ATTR_METADATA_ID, Gestione driver restituisce SQL_ERROR con SQLSTATE HY092 (identificatore di attributo/opzione non valido).

  3. Gestione driver esegue i controlli necessari per verificare se SQLSTATE 08003 (Connessione non aperta) o SQLSTATE HY010 (errore di sequenza di funzione) deve essere generato. In tal caso, Gestione driver restituisce SQL_ERROR e pubblica il messaggio di errore appropriato. Non si applicano altre regole di questa sezione.

  4. Gestione driver chiama SQLGetConnectOption come segue:

    SQLGetConnectOption (ConnectionHandle, Attribute, ValuePtr);  
    

    Nota che BufferLength e StringLengthPtr vengono ignorati.

SQLGetData

Quando un'applicazione ODBC 3.x che utilizza un driver ODBC 2.x chiama SQLGetData con l'argomento ColumnNumber uguale a 0, Gestione driver ODBC 3.x esegue il mapping a una chiamata a SQLGetStmtOption con l'attributo Optioni impostato su SQL_GET_BOOKMARK.

SQLGetStmtAttr

Gestione driver esegue il mapping a SQLGetStmtOption. La chiamata seguente a SQLGetStmtAttr:

SQLGetStmtAttr(StatementHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);  

darà luogo alla sequenza di passaggi seguente:

  1. Se Attribute non è un attributo di connessione o istruzione definito dal driver e non è un attributo definito in ODBC 2.x, Gestione driver restituisce SQL_ERROR con SQLSTATE HY092 (identificatore di attributo/opzione non valido). Non si applicano altre regole in questa sezione.

  2. Se Attribute è uno dei seguenti:

    SQL_ATTR_APP_ROW_DESC

    SQL_ATTR_APP_PARAM_DESC

    SQL_ATTR_AUTO_IPD

    SQL_ATTR_ROW_BIND_TYPE

    SQL_ATTR_IMP_ROW_DESC

    SQL_ATTR_IMP_PARAM_DESC

    SQL_ATTR_METADATA_ID

    SQL_ATTR_PARAM_BIND_TYPE

    SQL_ATTR_PREDICATE_PTR

    SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR

    SQL_ATTR_PARAM_BIND_OFFSET_PTR

    SQL_ATTR_ROW_BIND_OFFSET_PTR

    SQL_ATTR_ROW_OPERATION_PTR

    SQL_ATTR_PARAM_OPERATION_PTR

    Gestione driver restituisce SQL_ERROR con SQLSTATE HY092 (identificatore di attributo/opzione non valido). Non si applicano altre regole di questa sezione.

  3. Gestione driver esegue i controlli necessari per verificare se deve essere generato SQLSTATE HY010 (errore della sequenza di funzioni). In tal caso, Gestione driver restituisce SQL_ERROR e SQLSTATE HY010 (errore della sequenza di funzioni). Non si applicano altre regole di questa sezione.

  4. Se Attribute è uguale a SQL_ATTR_ROWS_FETCHED_PTR, Gestione driver restituisce un puntatore alla variabile interna di Gestione driver cRow, che ha usato o userà in una chiamata a SQLExtendedFetch. Non si applicano altre regole di questa sezione.

  5. Se Attribute è uguale a SQL_DESC_FETCH_BOOKMARK_PTR, Gestione driver restituisce il puntatore appropriato memorizzato nella cache durante una chiamata a SQLSetStmtAttr.

  6. Se Attribute è uguale a SQL_ATTR_ROW_STATUS_PTR, Gestione driver restituisce il puntatore appropriato memorizzato nella cache durante una chiamata a SQLSetStmtAttr.

  7. Gestione driver chiama SQLGetStmtOption come indicato di seguito:

    SQLGetStmtOption (hstmt, fOption, pvParam);  
    

    dove hstmt, fOption e pvParam verranno impostati rispettivamente sui valori di StatementHandle, Attribute e ValuePtr. BufferLength e StringLengthPtr vengono ignorati.

SQLSetConnectAttr

Gestione driver esegue il mapping a SQLSetConnectOption. La chiamata seguente a SQLSetConnectAttr:

SQLSetConnectAttr(ConnectionHandle, Attribute, ValuePtr, StringLength);  

darà luogo alla sequenza di passaggi seguente:

  1. Se Attribute non è un attributo di connessione o istruzione definito dal driver e non è un attributo definito in ODBC 2.x, Gestione driver restituisce SQL_ERROR con SQLSTATE HY092 (identificatore di attributo/opzione non valido). Non si applicano altre regole in questa sezione.

  2. Se Attribute è uguale a SQL_ATTR_AUTO_IPD, Gestione driver restituisce SQL_ERROR con SQLSTATE HY092 (identificatore di attributo/opzione non valido).

  3. Gestione driver esegue i controlli necessari per verificare se SQLSTATE 08003 (Connessione non aperta) o SQLSTATE HY010 (errore di sequenza di funzione) deve essere generato. Se uno di questi errori deve essere generato, Gestione driver restituisce SQL_ERROR e pubblica il messaggio di errore appropriato. Non si applicano altre regole di questa sezione.

  4. Gestione driver chiama SQLSetConnectOption come indicato di seguito:

    SQLSetConnectOption (hdbc, fOption, vParam);  
    

    dove hdbc, fOption e vParam verranno impostati rispettivamente sui valori di ConnectionHandle, Attribute e ValuePtr. StringLengthPtr viene ignorato.

Nota

La possibilità di impostare gli attributi dell'istruzione a livello di connessione è stata deprecata. Gli attributi dell'istruzione non devono mai essere impostati a livello di connessione da un'applicazione ODBC 3.x.

SQLSetStmtAttr

Gestione driver esegue il mapping a SQLSetStmtOption. La chiamata seguente a SQLSetStmtAttr:

SQLSetStmtAttr(StatementHandle, Attribute, ValuePtr, StringLength);  

darà luogo alla sequenza di passaggi seguente:

  1. Se Attribute non è un attributo di connessione o istruzione definito dal driver e non è un attributo definito in ODBC 2.x, Gestione driver restituisce SQL_ERROR con SQLSTATE HY092 (identificatore di attributo/opzione non valido). Non si applicano altre regole in questa sezione.

  2. Se Attribute è uno dei seguenti:

    SQL_ATTR_APP_ROW_DESC

    SQL_ATTR_APP_PARAM_DESC

    SQL_ATTR_AUTO_IPD

    SQL_ATTR_ROW_BIND_TYPE

    SQL_ATTR_IMP_ROW_DESC

    SQL_ATTR_IMP_PARAM_DESC

    SQL_ATTR_METADATA_ID

    SQL_ATTR_PARAM_BIND_TYPE

    SQL_ATTR_PREDICATE_PTR

    SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR

    SQL_ATTR_PARAM_BIND_OFFSET_PTR

    SQL_ATTR_ROW_BIND_OFFSET_PTR

    SQL_ATTR_ROW_OPERATION_PTR

    SQL_ATTR_PARAM_OPERATION_PTR

    Gestione driver restituisce SQL_ERROR con SQLSTATE HY092 (identificatore di attributo/opzione non valido). Non si applicano altre regole di questa sezione.

  3. Gestione driver esegue i controlli necessari per verificare se è necessario che venga generato SQLSTATE HY010 (errore della sequenza di funzioni). In tal caso, Gestione driver restituisce SQL_ERROR e SQLSTATE HY010 (errore della sequenza di funzioni). Non si applicano altre regole di questa sezione.

  4. Se Attribute è uguale a SQL_ATTR_PARAMSET_SIZE o SQL_ATTR_PARAMS_PROCESSED_PTR, vedere la sezione "Mapping per la gestione delle matrici di parametri" più avanti in questo argomento. Non si applicano altre regole di questa sezione.

  5. Se Attribute è uguale a SQL_ATTR_ROWS_FETCHED_PTR, Gestione driver memorizza nella cache il valore del puntatore per un uso successivo con SQLFetchScroll.

  6. Se Attribute è uguale a SQL_ATTR_ROW_STATUS_PTR, Gestione driver memorizza nella cache il valore del puntatore per un uso successivo con SQLFetchScroll o SQLSetPos. Non si applicano altre regole di questa sezione.

  7. Se Attribute è uguale a SQL_ATTR_FETCH_BOOKMARK_PTR, Gestione driver memorizza nella cache ValuePtr e userà il valore memorizzato nella cache in un secondo momento in una chiamata a SQLFetchScroll. Non si applicano altre regole di questa sezione.

  8. Gestione driver chiama SQLSetStmtOption come segue:

    SQLSetStmtOption (hstmt, fOption, vParam);  
    

    dove hstmt, fOption e vParam verranno impostati rispettivamente sui valori di StatementHandle, Attribute e ValuePtr. L'argomento StringLength viene ignorato.

    Se un driver ODBC 2.x supporta le opzioni di istruzione specifiche del driver, un'applicazione ODBC 3.x deve chiamare SQLSetStmtOption per impostare tali opzioni.

Mapping per la gestione delle matrici di parametri

Quando l'applicazione chiama:

SQLSetStmtAttr (StatementHandle, SQL_ATTR_PARAMSET_SIZE, Size, StringLength);  

Gestione driver chiama:

SQLParamOptions (StatementHandle, Size, &RowCount);  

Gestione driver restituisce successivamente un puntatore a questa variabile quando l'applicazione chiama SQLGetStmtAttr per recuperare SQL_ATTR_PARAMS_PROCES edizione Standard D_PTR. Gestione driver non può modificare questa variabile interna fino a quando l'handle di istruzione non viene restituito allo stato preparato o allocato.

Un'applicazione ODBC 3.x può chiamare SQLGetStmtAttr per ottenere il valore di SQL_ATTR_PARAMS_PROCESSED_PTR anche se non ha impostato in modo esplicito il campo SQL_DESC_ARRAY_SIZE nel APD. Questa situazione potrebbe verificarsi, ad esempio, se l'applicazione ha una routine generica che controlla la "riga" corrente di parametri in elaborazione quando SQLExecute restituisce SQL_NEED_DATA. Questa routine viene richiamata indipendentemente dal fatto che il SQL_DESC_ARRAY_SIZE sia 1 o sia maggiore di 1. A tale scopo, Gestione driver dovrà definire questa variabile interna indipendentemente dal fatto che l'applicazione abbia chiamato SQLSetStmtAttr per impostare il campo SQL_DESC_ARRAY_SIZE in APD. Se SQL_DESC_ARRAY_SIZE non è stato impostato, Gestione driver deve assicurarsi che questa variabile contenga il valore 1 prima della restituzione da SQLExecDirect o SQLExecute.

Gestione errori

In ODBC 3.x la chiamata a SQLFetch o SQLFetchScroll popola la SQL_DESC_ARRAY_STATUS_PTR nel campo IRD e il campo SQL_DIAG_ROW_NUMBER di un determinato record di diagnostica contiene il numero della riga nel set di righe a cui si riferisce il record. In questo modo, l'applicazione può correlare un messaggio di errore con una determinata posizione di riga.

Un driver ODBC 2.x non sarà in grado di fornire questa funzionalità. Tuttavia, fornirà la demarcazione degli errori con SQLSTATE 01S01 (errore nella riga). Un'applicazione ODBC 3.x che usa SQLFetch o SQLFetchScroll durante l'esecuzione di un driver ODBC 2.x deve essere a conoscenza di questo fatto. Nota anche che tale applicazione non sarà in grado di chiamare SQLGetDiagField per ottenere effettivamente il campo SQL_DIAG_ROW_NUMBER comunque. Un'applicazione ODBC 3.x che utilizza un driver ODBC 2.x sarà in grado di chiamare SQLGetDiagField solo con un argomento DiagIdentifier di SQL_DIAG_MESSAGE_TEXT, SQL_DIAG_NATIVE, SQL_DIAG_RETURNCODE o SQL_DIAG_SQLSTATE. Gestione driver ODBC 3.x mantiene la struttura dei dati di diagnostica quando si utilizza un driver ODBC 2.x, ma il driver ODBC 2.x restituisce solo questi quattro campi.

Quando un'applicazione ODBC 2.x utilizza un driver ODBC 2.x, se un'operazione può causare la restituzione di più errori da Gestione driver, è possibile che vengano restituiti errori diversi da GESTIONE driver ODBC 3.x rispetto a ODBC 2.x Driver Manager.

Mapping per le operazioni dei segnalibri

Gestione driver ODBC 3.x esegue i mapping seguenti quando un'applicazione ODBC 3.x che utilizza un driver ODBC 2.x esegue operazioni sui segnalibri.

SQLBindCol

Quando un'applicazione ODBC 3.x che utilizza un driver ODBC 2.x chiama SQLBindCol per eseguire l'associazione alla colonna 0 con fCType uguale a SQL_C_VARBOOKMARK, il Gestione driver ODBC 3.x verifica se l'argomento BufferLength è minore di 4 o maggiore di 4 e, in tal caso, restituisce SQLSTATE HY090 (stringa o lunghezza del buffer non valida). Se l'argomento BufferLength è uguale a 4, Gestione driver chiama SQLBindCol nel driver, dopo aver sostituito fCType con SQL_C_BOOKMARK.

SQLColAttribute

Quando un'applicazione ODBC 3.x che utilizza un driver ODBC 2.x chiama SQLColAttribute con l'argomento ColumnNumber impostato su 0, Gestione driver restituisce i valori FieldIdentifier elencati nella tabella seguente.

FieldIdentifier Valore
SQL_DESC_AUTO_UNIQUE_VALUE SQL_FALSE
SQL_DESC_CASE_SENSITIVE SQL_FALSE
SQL_DESC_CATALOG_NAME "" (stringa vuota)
SQL_DESC_CONCISE_TYPE SQL_BINARY
SQL_DESC_COUNT Lo stesso valore restituito da SQLNumResultCols
SQL_DESC_DATETIME_INTERVAL_CODE 0
SQL_DESC_DISPLAY_SIZE 8
SQL_DESC_FIXED_PREC_SCALE SQL_FALSE
SQL_DESC_LABEL "" (stringa vuota)
SQL_DESC_LENGTH 0
SQL_DESC_LITERAL_PREFIX "" (stringa vuota)
SQL_DESC_LITERAL_SUFFIX "" (stringa vuota)
SQL_DESC_LOCAL_TYPE_NAME "" (stringa vuota)
SQL_DESC_NAME "" (stringa vuota)
SQL_DESC_NULLABLE SQL_NO_NULLS
SQL_DESC_OCTET_LENGTH 4
SQL_DESC_PRECISION 4
SQL_DESC_SCALE 0
SQL_DESC_SCHEMA_NAME "" (stringa vuota)
SQL_DESC_SEARCHABLE SQL_PRED_NONE
SQL_DESC_TABLE_NAME "" (stringa vuota)
SQL_DESC_TYPE SQL_BINARY
SQL_DESC_TYPE_NAME "" (stringa vuota)
SQL_DESC_UNNAMED SQL_UNNAMED
SQL_DESC_UNSIGNED SQL_FALSE
SQL_DESC_UPDATEABLE SQL_ATTR_READ_ONLY

SQLDescribeCol

Quando un'applicazione ODBC 3.x che utilizza un driver ODBC 2.x chiama SQLDescribeCol con l'argomento ColumnNumber impostato su 0, Gestione driver restituisce i valori elencati nella tabella seguente.

Buffer Valore
ColumnName "" (stringa vuota)
*NameLengthPtr 0
*DataTypePtr SQL_BINARY
*ColumnSizePtr 4
*DecimalDigitsPtr 0
*NullablePtr SQL_NO_NULLS

SQLGetData

Quando un'applicazione ODBC 3.x che utilizza un driver ODBC 2.x effettua la chiamata seguente a SQLGetData per recuperare un segnalibro:

SQLGetData(StatementHandle, 0, SQL_C_VARBOOKMARK, TargetValuePtr, BufferLength, StrLen_or_IndPtr)  

la chiamata viene mappata a SQLGetStmtOption con fOption di SQL_GET_BOOKMARK, come indicato di seguito:

SQLGetStmtOption(hstmt, SQL_GET_BOOKMARK, TargetValuePtr)  

dove hstmt e pvParam sono impostati rispettivamente sui valori in StatementHandle e TargetValuePtr. Il segnalibro viene restituito nel buffer a cui punta l'argomento pvParam (TargetValuePtr). Il valore nel buffer a cui punta l'argomento StrLen_or_IndPtr nella chiamata a SQLGetData è impostato su 4.

Questo mapping è necessario per tenere conto del caso in cui SQLFetch è stato chiamato prima della chiamata a SQLGetData e il driver ODBC 2.x non supporta SQLExtendedFetch. In questo caso, SQLFetch viene passato al driver ODBC 2.x, nel qual caso il recupero dei segnalibri non è supportato.

SqlGetData non può essere chiamato più volte in un driver ODBC 2.x per recuperare un segnalibro in parti, quindi la chiamata a SQLGetData con l'argomento BufferLength impostato su un valore minore di 4 e l'argomento ColumnNumber impostato su 0 restituirà SQLSTATE HY090 (stringa o lunghezza del buffer non valida). SQLGetData può tuttavia essere chiamato più volte per recuperare lo stesso segnalibro.

SQLSetStmtAttr

Quando un'applicazione ODBC 3.x che utilizza un driver ODBC 2.x chiama SQLSetStmtAttr per impostare l'attributo SQL_ATTR_USE_BOOKMARKS su SQL_UB_VARIABLE, Gestione driver imposta l'attributo su SQL_UB_ON nel driver ODBC 2.x sottostante.