Informazioni sulle conversioni dei tipi di dati
Per semplificare la conversione dei tipi di dati del linguaggio di programmazione Java nei tipi di dati SQL Server, nel driver JDBC per Microsoft SQL Server sono disponibili le conversioni dei tipi di dati richieste dalla specifica JDBC. Per offrire maggiore flessibilità, tutti i tipi sono convertibili da e verso i tipi di dati Object, String e byte[].
Conversioni dei metodi di richiamo
Sulla base dei tipi di dati SQL Server, il grafico seguente contiene la mappa di conversione del driver JDBC per i metodi get<Type>() della classe SQLServerResultSet e le conversioni supportate nei metodi get<Type> della classe SQLServerCallableStatement.
Sono disponibili tre categorie di conversione supportate dai metodi di richiamo del driver JDBC:
Senza perdita di dati (x): Conversioni nei casi in cui il tipo di richiamo è inferiore o identico al tipo di server sottostante. Ad esempio, quando si esegue la chiamata a getBigDecimal in una colonna decimale del server sottostante, la conversione non è necessaria.
Convertito (y): Conversioni dai tipi di server numerico ai tipi di linguaggio Java in cui la conversione è regolare e segue le regole di conversione del linguaggio Java. In tali conversioni, la precisione viene sempre troncata, mai arrotondata, e l'overflow viene gestito come modulo del tipo di destinazione inferiore. Quando, ad esempio, si chiama getInt su una colonna decimal sottostante che contiene "1,9999" il valore restituito sarà "1", oppure se il valore decimal sottostante è "3000000000", il valore int causa un overflow in "-1294967296".
Dipendente dai dati (z): Le conversioni dai tipi di caratteri sottostanti in tipi numerici richiedono che i tipi di caratteri contengano valori che è possibile convertire in quel determinato tipo. Non vengono eseguite altre conversioni. Se è troppo grande per il tipo di richiamo, il valore non sarà valido. Se, ad esempio, viene chiamato getInt su una colonna varchar(50) che contiene "53", il valore verrà restituito come int. Se invece il valore sottostante è "xyz" o "3000000000", verrà generato un errore.
Se getString viene chiamato su un tipo di dati colonna binary, varbinary, varbinary(max) o image, il valore verrà restituito come stringa esadecimale.
Conversioni dei metodi di aggiornamento
Per i dati Java tipizzati passati ai metodi update<Type>() della classe SQLServerResultSet si applicano le seguenti conversioni.
Sono disponibili tre categorie di conversione supportate dai metodi di aggiornamento del driver JDBC:
Senza perdita di dati (x): Conversioni nei casi in cui il tipo di aggiornamento è inferiore o identico al tipo di server sottostante. Ad esempio, quando si esegue la chiamata a updateBigDecimal in una colonna decimale del server sottostante, la conversione non è necessaria.
Convertito (y): Conversioni dai tipi di server numerico ai tipi di linguaggio Java in cui la conversione è regolare e segue le regole di conversione del linguaggio Java. In tali conversioni, la precisione viene sempre troncata, mai arrotondata, e l'overflow viene gestito come modulo del tipo di destinazione, ovvero quello inferiore. Quando, ad esempio, si chiama updateDecimal su una colonna int sottostante che contiene "1,9999" il valore restituito sarà "1", oppure se il valore decimal sottostante è "3000000000", il valore int causa un overflow in "-1294967296".
Dipendente dai dati (z): Le conversioni dai tipi di dati di origine sottostanti in tipi di dati di destinazione richiedono che i valori contenuti possano essere convertiti nei tipi di destinazione. Non vengono eseguite altre conversioni. Se è troppo grande per il tipo di richiamo, il valore non sarà valido. Se, ad esempio, updateString viene chiamato su una colonna int che contiene "53", l'aggiornamento verrà eseguito. Se invece il valore String sottostante è "foo" o "3000000000", verrà generato un errore.
Quando updateString viene chiamato su un tipo di dati colonna binary, varbinary, varbinary(max) o image, il valore String verrà gestito come valore di stringa esadecimale.
Quando il tipo di dati colonna di SQL Server è XML, il valore dei dati deve essere un valore XML valido. Quando si chiama il metodo updateBytes, updateBinaryStream o updateBlob, il valore dei dati deve essere la rappresentazione di stringa esadecimale dei caratteri XML. Ad esempio:
<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E
Si noti che se i caratteri XML sono espressi in codifiche di caratteri specifiche, è necessario un indicatore dell'ordine dei byte (BOM, Byte-Order Mark).
Conversioni dei metodi di impostazione
Per i tipi Java tipizzati passati ai metodi set<Type>() delle classi SQLServerPreparedStatement e SQLServerCallableStatement, si applicano le seguenti conversioni.
Il server cercherà di eseguire la conversione e restituirà degli errori in caso di esito negativo.
Nel caso del tipo di dati String, se il valore supera la lunghezza di VARCHAR, ne verrà eseguito il mapping a LONGVARCHAR. Analogamente, nel caso del tipo di dati NVARCHAR, se il valore supera la lunghezza di LONGNVARCHAR, ne verrà eseguito il mapping a NVARCHAR. Lo stesso vale per byte[]. I valori più lunghi di VARBINARY diventano LONGVARBINARY.
Sono disponibili due categorie di conversione supportate dai metodi di impostazione del driver JDBC:
Senza perdita di dati (x): Conversioni nei casi numerici in cui il tipo di impostazione è inferiore o identico al tipo di server sottostante. Quando, ad esempio, si chiama setBigDecimal su una colonna decimal del server sottostante, la conversione non è necessaria. Per la conversione da un tipo numeric a un tipo character, il tipo di dati numeric Java viene convertito in String. Ad esempio, la chiamata a setDouble con un valore pari a "53" in una colonna varchar(50) produrrà un valore character "53" nella colonna di destinazione.
Convertito (y): Conversioni da un tipo numeric Java a un tipo numeric del server sottostante inferiore. Questa conversione è regolare e segue le convenzioni di conversione di SQL Server. La precisione è sempre troncata, mai arrotondata, e l'overflow genera un errore di conversione non supportata. Ad esempio, utilizzando updateDecimal con un valore pari a "1,9999" in una colonna integer sottostante verrà restituito "1" nella colonna di destinazione. Se invece viene passato "3000000000", verrà generato un errore.
Dipendente dai dati (z): Le conversioni da un tipo String Java al tipo di dati di SQL Server sottostante dipendono dalle seguenti condizioni. Il driver invia il valore String a SQL Server che esegue le eventuali conversioni necessarie. Se sendStringParametersAsUnicode è impostato su true e il tipo di dati di SQL Server sottostante è image, non verrà consentita la conversione di nvarchar in image e verrà generata un'eccezione SQLServerException. Se sendStringParametersAsUnicode è impostato su false e il tipo di dati di SQL Server sottostante è image, la conversione di varchar in image verrà consentita e non verrà generata alcuna eccezione.
SQL Server esegue le conversioni e restituisce gli errori al driver JDBC in caso di problemi.
Quando il tipo di dati colonna di SQL Server è XML, il valore dei dati deve essere un valore XML valido. Quando si chiama il metodo updateBytes, updateBinaryStream o updateBlob, il valore dei dati deve essere la rappresentazione di stringa esadecimale dei caratteri XML. Ad esempio:
<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E
Si noti che se i caratteri XML sono espressi in codifiche di caratteri specifiche, è necessario un indicatore dell'ordine dei byte (BOM, Byte-Order Mark).
Conversioni in setObject
Per i dati Java tipizzati passati ai metodi setObject(<Type>) della classe SQLServerPreparedStatement, si applicano le seguenti conversioni.
Il metodo setObject senza alcun tipo di destinazione specificato utilizzerà il mapping predefinito. Nel caso del tipo di dati String, se il valore supera la lunghezza di VARCHAR, ne verrà eseguito il mapping a LONGVARCHAR. Analogamente, nel caso del tipo di dati NVARCHAR, se il valore supera la lunghezza di LONGNVARCHAR, ne verrà eseguito il mapping a NVARCHAR. Lo stesso vale per byte[]. I valori più lunghi di VARBINARY diventano LONGVARBINARY.
Sono disponibili tre categorie di conversione supportate dai metodi setObject del driver JDBC:
Senza perdita di dati (x): Conversioni nei casi numerici in cui il tipo di impostazione è inferiore o identico al tipo di server sottostante. Quando, ad esempio, si chiama setBigDecimal su una colonna decimal del server sottostante, la conversione non è necessaria. Per la conversione da un tipo numeric a un tipo character, il tipo di dati numeric Java viene convertito in String. Ad esempio, la chiamata a setDouble con un valore di "53" in una colonna varchar(50) produrrà un valore character "53" nella colonna di destinazione.
Convertito (y): Conversioni da un tipo numeric Java a un tipo numeric del server sottostante inferiore. Questa conversione è regolare e segue le convenzioni di conversione di SQL Server. La precisione è sempre troncata, mai arrotondata, e l'overflow genera un errore di conversione non supportata. Ad esempio, utilizzando updateDecimal con un valore pari a "1,9999" in una colonna integer sottostante verrà restituito "1" nella colonna di destinazione. Se invece viene passato "3000000000", verrà generato un errore.
Dipendente dai dati (z): Le conversioni da un tipo String Java al tipo di dati di SQL Server sottostante dipendono dalle seguenti condizioni. Il driver invia il valore String a SQL Server che esegue le eventuali conversioni necessarie. Se la proprietà di connessione sendStringParametersAsUnicode è impostato su true e il tipo di dati di SQL Server sottostante è image, non verrà consentita la conversione di nvarchar in image e verrà generata un'eccezione SQLServerException. Se sendStringParametersAsUnicode è impostato su false e il tipo di dati di SQL Server sottostante è image, la conversione di varchar in image verrà consentita e non verrà generata alcuna eccezione.
SQL Server esegue l'impostazione bulk delle conversioni e restituisce gli errori al driver JDBC in caso di problemi. Le conversioni sul lato client non sono frequenti e vengono eseguite solo nel caso di valori date, time, timestamp, Boolean e String.
Quando il tipo di dati colonna di SQL Server è XML, il valore dei dati deve essere un valore XML valido. Quando si chiama il metodo setObject(byte[], SQLXML), setObject(inputStream, SQLXML) o setObject(Blob, SQLXML), il valore dei dati deve essere la rappresentazione di stringa esadecimale dei caratteri XML. Ad esempio:
<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E
Si noti che se i caratteri XML sono espressi in codifiche di caratteri specifiche, è necessario un indicatore dell'ordine dei byte (BOM, Byte-Order Mark).