Utilizzo di tipi di dati avanzati
Nel driver JDBC per Microsoft SQL Server 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, InputStream, String |
text varchar(max) |
LONGVARCHAR |
String (default), Clob, InputStream |
ntext nvarchar(max) |
LONGVARCHAR LONGNVARCHAR (Java SE 6.0) |
String (default), Clob, NClob (Java SE 6.0) |
xml |
LONGVARCHAR SQLXML (Java SE 6.0) |
String (default), InputStream, Clob, byte[],Blob, SQLXML (Java SE 6.0) |
udt |
VARBINARY |
String (default), byte[], InputStream |
Nelle sezioni seguenti vengono forniti esempi di come sia possibile utilizzare il driver JDBC e i tipi di dati avanzati.
Tipi di dati BLOB, CLOB e NCLOB
Nel driver JDBC sono implementati tutti i metodi delle interfacce java.sql.Blob, java.sql.Clob e java.sql.NClob.
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), i tipi BLOB con i tipi di dati varbinary(max) e image, mentre i tipi NCLOB con i tipi di dati ntext e nvarchar(max).
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 è 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:
PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (Col1, Col2) VALUES(?,?)");
File inputFile = new File("CLOBFile20mb.jpg");
FileInputStream inStream = new FileInputStream(inputFile);
int id = 1;
pstmt.setInt(1,id);
pstmt.setBinaryStream(2, inStream);
pstmt.executeUpdate();
inStream.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:
String SQL = "SELECT * FROM test1;";
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(SQL);
rs.next();
Clob clob = rs.getClob(2);
long pos = clob.position("dog", 1);
clob.setString(pos, "cat");
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
A partire da SQL Server 2005, in SQL Server è 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, BLOB oppure oggetto SQLXML. Il mapping predefinito è come stringa. A partire dalla versione 2.0, il driver JDBC offre il supporto per l'API di JDBC 4.0, in cui viene presentata l'interfaccia SQLXML. Tale interfaccia definisce i metodi per interagire e modificare i dati XML. Il tipo di dati SQLXML è mappato al tipo di dati xml di SQL Server. Per ulteriori informazioni su come leggere e scrivere dati XML da e in un database relazionale con il tipo di dati Java SQLXML, vedere Supporto dei dati XML.
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.
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) di 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 è 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.
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.