Condividi tramite


Mapping dei tipi di dati (ODBC)

Il driver ODBC di SQL Server Native Client esegue il mapping dei tipi di dati SQL Server ai tipi di dati SQL ODBC. Nelle sezioni seguenti vengono illustrati i tipi di dati SQL Server SQL e i tipi di dati SQL ODBC con i quali eseguono il mapping. Vengono inoltre illustrati i tipi di dati SQL ODBC e i tipi di dati C ODBC corrispondenti, nonché le conversioni supportate e quelle predefinite.

[!NOTA]

Il tipo di dati SQL Servertimestamp esegue il mapping al tipo di dati ODBC SQL_BINARY o SQL_VARBINARY, in quanto i valori nelle colonne timestamp non sono di tipo datetime, ma sono valori binary(8) o varbinary(8) che indicano la sequenza dell'attività di SQL Server nella riga. Se il driver ODBC di SQL Server Native Client rileva un valore SQL_C_WCHAR (Unicode) che corrisponde a un numero dispari di byte, il byte dispari finale viene troncato.

Gestione del tipo di dati sql_variant in ODBC

La colonna con tipo di dati sql_variant può contenere qualsiasi tipo di dati di SQL Server, ad eccezione di LOB, come text, ntext e image. Tale colonna può ad esempio contenere valori smallint per alcune righe, valori float per altre e valori char/nchar nella parte restante delle righe.

Il tipo di dati sql_variant è simile al tipo Variant di Microsoft Visual Basic®.

Recupero di dati dal server

In ODBC non esiste il concetto dei tipi variant, che prevede un limite nell'utilizzo del tipo di dati sql_variant con un driver ODBC in SQL Server. In SQL Server, se viene specificata l'associazione, il tipo di dati sql_variant deve essere associato a uno dei tipi di dati ODBC documentati. SQL_CA_SS_VARIANT_TYPE, un nuovo attributo specifico del driver ODBC di SQL Server Native Client restituisce all'utente il tipo di dati di un'istanza nella colonna sql_variant.

Se non viene specificata alcuna associazione, la funzione SQLGetData può essere utilizzata per determinare il tipo di dati di un'istanza nella colonna sql_variant.

Per recuperare i dati sql_variant, effettuare le operazioni seguenti.

  1. Chiamare SQLFetch per posizionarsi sulla riga recuperata.

  2. Chiamare SQLGetData specificando SQL_C_BINARY per il tipo e 0 per la lunghezza dei dati. In questo modo al driver viene imposta la lettura dell'intestazione sql_variant. L'intestazione fornisce il tipo di dati dell'istanza specifica nella colonna sql_variant . SQLGetData restituisce le dimensioni in byte del valore.

  3. Chiamare SQLColAttribute specificando SQL_CA_SS_VARIANT_TYPE come relativo valore di attributo. Questa funzione restituirà al client il tipo di dati C dell'istanza nella colonna sql_variant.

Di seguito viene riportato un segmento di codice nel quale vengono mostrate le operazioni precedenti.

while ((retcode = SQLFetch (hstmt))==SQL_SUCCESS)
{
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
    {
        SQLError (NULL, NULL, hstmt, NULL, 
                    &lNativeError,szError,MAX_DATA,&sReturned);
        printf_s ("%s\n",szError);
        goto Exit;
    }
    retcode = SQLGetData (hstmt, 1, SQL_C_BINARY, 
                                pBuff,0,&Indicator);//Figure out the length
    if (retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_SUCCESS)
    {
        SQLError (NULL, NULL, hstmt, NULL, &lNativeError, 
                    szError,MAX_DATA,&sReturned);
        printf_s ("%s\n",szError);
        goto Exit;
    }
    printf_s ("Byte length : %d ",Indicator); //Print out the byte length
        
    int iValue = 0;
    retcode = SQLColAttribute (hstmt, 1, SQL_CA_SS_VARIANT_TYPE, NULL, 
                                        NULL,NULL,&iValue);  //Figure out the type
    printf_s ("Sub type = %d ",iValue);//Print the type, the return is C_type of the column]

// Set up a new binding or do the SQLGetData on that column with 
// the appropriate type
}

Se l'utente crea l'associazione utilizzando SQLBindCol, il driver legge i metadati e i dati. Il driver converte quindi i dati nel tipo ODBC appropriato specificato nell'associazione.

Invio dei dati al server

SQL_SS_VARIANT, un nuovo tipo di dati specifico del driver ODBC di SQL Server Native Client, viene utilizzato per i dati inviati a una colonna sql_variant. Quando si inviano dati al server utilizzando parametri (ad esempio INSERT INTO TableName VALUES (??)), viene utilizzato SQLBindParameter per specificare informazioni sui parametri che includono il tipo C e il tipo SQL Server corrispondente. Il driver ODBC di SQL Server Native Client convertirà il tipo di dati C in uno dei sottotipi sql_variant appropriati.

Vedere anche

Concetti