Condividi tramite


Utilizzo di tipi di dati avanzati

I tipi di dati JDBC avanzati sono stati introdotti nell'API principale di JDBC 2.0. Nel driver JDBC per Microsoft SQL Server 2005 i tipi di dati JDBC avanzati vengono utilizzati per convertire i tipi di dati SQL Server in un formato comprensibile nel linguaggio di programmazione Java.

Nella tabella seguente sono riportati i mapping predefiniti tra i tipi di dati avanzati di SQL Server, JDBC e del linguaggio di programmazione Java:

Tipi di SQL Server Tipi JDBC (java.sql.Types) Tipi del linguaggio Java

varbinary(max)

image

LONGVARBINARY

byte[] (default), Blob, CharacterStream, BinaryStream, String

text

ntext

varchar(max)

nvarchar(max)

LONGVARCHAR

String (default), Clob, CharacterStream, BinaryStream

xml

LONGVARCHAR

String (default), CharacterStream, Clob, byte[], BinaryStream, Blob

udt

VARBINARY (dimensione massima di 8000 byte)

String (default), byte[], BinaryStream, Object

Nelle sezioni seguenti vengono forniti esempi di come sia possibile utilizzare il driver JDBC e i tipi di dati avanzati.

Tipi di dati BLOB e CLOB

Nel driver JDBC sono implementati tutti i metodi di JDBC 3.0 delle interfacce java.sql.Blob e java.sql.Clob. Questi metodi consentono di recuperare e aggiornare le colonne di tipo text, ntext, xml e image.

Nota

I valori CLOB possono essere utilizzati con i tipi di dati di SQL Server 2005 per valori di grandi dimensioni. In particolare, i tipi CLOB possono essere utilizzati con i tipi di dati varchar(max) e nvarchar(max) e i tipi BLOB con i tipi di dati varbinary(max) e xml.

Tipi di dati per valori di grandi dimensioni

Nelle precedenti versioni di SQL Server, l'utilizzo di tipi di dati per valori di grandi dimensioni richiedeva particolari operazioni di gestione. I tipi di dati per valori di grandi dimensioni sono quelli che superano la dimensione massima delle righe di 8 KB. In SQL Server 2005 è stato introdotto un identificatore max per i tipi di dati varchar, nvarchar e varbinary, per consentire l'archiviazione di valori fino a 2^31 byte. Le colonne delle tabelle e le variabili Transact-SQL possono specificare tipi di dati varchar(max), nvarchar(max) o varbinary(max).

Gli scenari principali di utilizzo di tipi per valori di grandi dimensioni riguardano il recupero di tali tipi di dati da un database o l'aggiunta degli stessi a un database. Nelle sezioni seguenti vengono descritti i diversi approcci adottabili per eseguire queste attività.

Recupero di tipi per valori di grandi dimensioni da un database

Quando si recupera un tipo di dati per valori di grandi dimensioni non binario, ad esempio varchar(max), da un database, uno degli approcci adottabili consiste nel leggere i dati in questione come flusso di caratteri. Nell'esempio seguente viene utilizzato il metodo executeQuery della classe SQLServerStatement per recuperare dati dal database e restituirli come set di risultati. Viene quindi utilizzato il metodo getCharacterStream della classe SQLServerResultSet per leggere i dati per valori di grandi dimensioni dal set di risultati.

ResultSet rs = stmt.executeQuery("SELECT TOP 1 * FROM Test1");
rs.next();
Reader reader = rs.getCharacterStream(2);

Nota

Questo stesso approccio può essere utilizzato anche per i tipi di dati text, ntext e nvarchar(max).

Quando si recupera un tipo di dati per valori di grandi dimensioni binario, ad esempio varbinary(max), da un database, è possibile adottare diversi approcci. L'approccio più efficace consiste nel leggere i dati come flusso binario, come nell'esempio seguente:

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
Rs.next();
InputStream is = rs.getBinaryStream(2);

È inoltre possibile utilizzare il metodo getBytes per leggere i dati come matrice di byte, come nell'esempio seguente:

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
Rs.next();
byte [] b = rs.getBytes(2);

Nota

I dati possono essere letti anche come BLOB. Tuttavia, questo metodo è meno efficace dei due precedenti.

Aggiunta di tipi per valori di grandi dimensioni a un database

Il caricamento di dati di grandi dimensioni con il driver JDBC funziona bene per i dati di dimensioni pari a quelle della memoria, e nel caso di dati di dimensioni maggiori di quelle della memoria, l'opzione principale è rappresentata dall'utilizzo di flussi. Tuttavia, il modo più efficace per caricare dati di grandi dimensioni è mediante interfacce di flusso.

È però possibile utilizzare anche stringhe o byte, come nell'esempio seguente:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (?, ?)");
pstmt.setInt(1, 1);
pstmt.setString(2, htmlStr);
pstmt.executeUpdate();

Nota

Questo approccio può essere utilizzato anche per valori archiviati in colonne text, ntext e nvarchar(max).

Se nel server è presente una libreria di immagini ed è necessario caricare interi file di immagine binari in una colonna varbinary(max), il modo più efficace per eseguire tale attività con il driver JDBC consiste nell'utilizzare direttamente flussi, come nell'esempio seguente:

Statement stmt = con.createStatement();
PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 
VALUES( ?, ? )");
FileReader in = new FileReader(new File("CLOBFile20mb.txt");
long len = fileIn.length();
int id = 1;
pstmt.setInt(1,id);
pstmt.setCharacterStream(2, in, (int)len);
pstmt.executeUpdate();
in.close();

Nota

L'utilizzo del metodo Clob o Blob non rappresenta un modo efficace di caricamento di dati di grandi dimensioni.

Modifica di tipi per valori di grandi dimensioni in un database

Nella maggior parte dei casi, l'approccio consigliato per aggiornare o modificare valori di grandi dimensioni nel database consiste nel passare parametri mediante le classi SQLServerPreparedStatement e SQLServerCallableStatement, utilizzando comandi Transact-SQL quali UPDATE, WRITE e SUBSTRING.

Se è necessario sostituire l'istanza di una parola in un file di testo di grandi dimensioni, quale ad esempio un file HTML archiviato, è possibile utilizzare un oggetto Clob, come nell'esempio seguente:

Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test1");
rs.next();
Clob clob = rs.getClob(2);
long pos = clob.position("dog", 1);
clob.setString(1, "cat", len, 3);
rs.updateClob(2, clob);
rs.updateRow();

Inoltre, è possibile eseguire tutte le operazioni sul server e quindi passare solo i parametri a un'istruzione UPDATE preparata.

Per ulteriori informazioni sui tipi per valori di grandi dimensioni, vedere la sezione relativa all'utilizzo di tipi per valori di grandi dimensioni nella Documentazione in linea di SQL Server.

Tipo di dati XML

In SQL Server 2005 è disponibile un tipo di dati xml che consente di archiviare documenti e frammenti XML in un database di SQL Server. Il tipo di dati xml è un tipo di dati predefinito in SQL Server ed è simile ad altri tipi predefiniti quali int e varchar. Come accade con gli altri tipi predefiniti, è possibile utilizzare il tipo di dati xml come tipo di colonna quando si crea una tabella, come tipo di variabile, come tipo di parametro o come tipo restituito da una funzione oppure nelle funzioni Transact-SQL CAST e CONVERT.

Nel driver JDBC, il tipo di dati xml può essere mappato come stringa, matrice di byte, flusso o oggetto CLOB o BLOB. La rappresentazione predefinita corrisponde a una stringa. L'implementazione del tipo di dati xml nel driver JDBC consente di supportare quanto segue:

  • Accesso al codice XML come stringa UTF-16 Java standard per la maggior parte degli scenari di programmazione comuni

  • Input di codice XML in formato UTF-8 e con altri tipi di codifica a 8 bit

  • Accesso al codice XML come matrice di byte, con un indicatore dell'ordine di byte (BOM) iniziale in caso di codifica in formato UTF-16 per l'interscambio con altri processori e file su disco XML

SQL Server richiede un indicatore dell'ordine di byte (BOM) iniziale per il codice XML con codifica UTF-16. Questo elemento deve essere fornito dall'applicazione quando i valori dei parametri XML vengono forniti come matrici di byte. Nell'output di SQL Server i valori XML sono sempre presenti come stringhe UTF-16 senza indicatore dell'ordine di byte (BOM) né dichiarazione di codifica incorporata. Quando i valori XML vengono recuperati come byte[], BinaryStream o Blob, sono preceduti da un indicatore dell'ordine di byte (BOM) UTF-16.

Nota

Il driver JDBC non supporta la lettura dei parametri di output delle stored procedure del tipo di dati xml. Supporta tuttavia l'utilizzo del tipo di dati xml come parametro di input. Per utilizzare il tipo di dati xml come parametro di output, è necessario innanzitutto convertire il tipo xml in un tipo di dati VARCHAR o LONGVARCHAR nella stored procedure per poterlo leggere.

Per ulteriori informazioni sul tipo di dati xml, vedere l'argomento "Tipo di dati XML" nella documentazione in linea di SQL Server.

Tipo di dati definito dall'utente

L'introduzione di tipi definiti dall'utente (UDT, User-Defined Type) in SQL Server 2005 estende il sistema di tipi SQL consentendo di archiviare oggetti e strutture di dati personalizzate in un database di SQL Server. I tipi di dati UDT possono contenere più tipi di dati e avere comportamenti diversi, differenziandosi dai tradizionali tipi di dati alias costituiti da un solo tipo di dati di sistema di SQL Server. I tipi di dati UDT vengono definiti utilizzando uno qualsiasi dei linguaggi supportati dalla funzionalità CLR (Common Language Runtime) Microsoft.NET in grado di produrre codice verificabile, tra cui Microsoft Visual C# e Visual Basic .NET. I dati vengono esposti come campi e proprietà di una classe o una struttura basata su .NET Framework e i comportamenti vengono definiti dai metodi della classe o della struttura in questione.

In SQL Server 2005 è possibile utilizzare un tipo di dati UDT come definizione di colonna di una tabella, come variabile in un batch Transact-SQL o come argomento di una funzione o una stored procedure Transact-SQL.

Nota

Il driver JDBC non supporta i metodi per il richiamo o l'impostazione per i metodi AsciiStream e CharacterStream in colonne con tipo definito dall'utente. Inoltre, come accade per il tipo di dati XML, il driver JDBC non supporta la lettura dei parametri di output delle stored procedure del tipo di dati UDT. Tuttavia, supporta l'utilizzo del tipo di dati UDT in forma di parametri di input. Per utilizzare il tipo di dati UDT come parametro di output, è necessario innanzitutto convertirlo in un tipo di dati varbinary(max) nella stored procedure per poterlo leggere.

Per ulteriori informazioni sui tipi di dati definiti dall'utente, vedere la sezione sull'utilizzo e la modifica delle istanze dei tipi definiti dall'utente nella documentazione in linea di SQL Server.

Vedere anche

Altre risorse

Informazioni sui tipi di dati del driver JDBC