Usar tipos de datos avanzados

Los tipos de datos avanzados de JDBC se introdujeron en la API principal de JDBC 2.0. El controlador JDBC de Microsoft SQL Server 2005 usa los tipos de datos avanzados de JDBC para convertir los tipos de datos de SQL Server a un formato que el lenguaje de programación Java puede comprender.

La siguiente tabla muestra las asignaciones predeterminadas entre los tipos de datos de SQL Server avanzados, JDBC y del lenguaje de programación Java.

Tipos de SQL Server Tipos de JDBC (Tipos de java.sql.) Tipos de lenguaje Java

varbinary(max)

image

LONGVARBINARY

byte[] (predeterminado), Blob, CharacterStream, BinaryStream, Cadena

text

ntext

varchar(max)

nvarchar(max)

LONGVARCHAR

Cadena (predeterminado), Clob, CharacterStream, BinaryStream

xml

LONGVARCHAR

Cadena (predeterminado), CharacterStream, Clob, byte[], BinaryStream, Blob

udt

VARBINARY (tamaño máx. de 8.000 bytes)

Cadena (predeterminado), byte[], BinaryStream, Objeto

Las siguientes secciones proporcionan ejemplos de cómo puede usar el controlador JDBC y los tipos de datos avanzados.

Tipos de datos BLOB y CLOB

El controlador JDBC implementa todos los métodos JDBC 3.0 de las interfaces java.sql.Blob y java.sql.Clob. Utilizando estos métodos, puede recuperar y actualizar las columnas de tipo text, ntext, xml e image.

Nota

Los valores CLOB se pueden usar con tipos de datos de valores grandes de SQL Server 2005. Específicamente, los tipos CLOB se pueden utilizar con los tipos de datos varchar(max) y nvarchar(max), y los tipos BLOB se pueden utilizar con los tipos de datos varbinary(max) y xml.

Tipos de datos de valores grandes

En versiones anteriores de SQL Server, el trabajo con tipos de datos de valores grandes requería un tratamiento especial. Los tipos de datos de valores grandes son aquellos que superan el tamaño máximo de fila, 8 KB.SQL Server 2005 introduce un especificador máximo para los tipos de datos varchar, nvarchar y varbinary para permitir el almacenamiento de valores de hasta 2^31 bytes. Las columnas de tablas y las variables Transact-SQL pueden especificar los tipos de datos varchar(max), nvarchar(max) o varbinary(max).

Los escenarios principales en los que se trabaja con tipos de valores grandes implican su recuperación de una base de datos o agregarlos a una base de datos. Las siguientes secciones describen diferentes enfoques para realizar estas tareas.

Recuperación de tipos de valores grandes de una base de datos

Al recuperar un tipo de datos de valores grandes, que no sean binarios, de una base de datos, como el tipo de datos varchar(max), un planteamiento es leer esos datos como una secuencia de caracteres. En el siguiente ejemplo, se usa el método executeQuery de la clase SQLServerStatement para recuperar datos de la base de datos y devolverlos como un conjunto de resultados. A continuación, se usa el método getCharacterStream de la clase SQLServerResultSet para leer los datos de valores grandes en el conjunto de resultados.

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

Nota

Este mismo enfoque también se puede utilizar para los tipos de datos text, ntext y nvarchar(max).

Al recuperar tipos de datos binarios de valores grandes, de una base de datos, como el tipo de datos varbinary(max), hay varios enfoques que se pueden aplicar. El enfoque más eficaz es leer los datos como una secuencia binaria, como en el siguiente ejemplo:

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

También puede usar el método getBytes para leer los datos como una matriz de bytes, como en el siguiente ejemplo:

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

Nota

También puede leer los datos como un BLOB. No obstante, éste es el método menos eficaz de los dos que se han mostrado anteriormente.

Agregar tipos de valores grandes a una base de datos

La carga de datos grandes con el controlador JDBC funciona bien para los casos en que tienen el tamaño de la memoria y, en los casos en los que son más grandes que la memoria, la transmisión por secuencias es la opción principal. No obstante, la manera más eficaz de cargar datos grandes es mediante interfaces de transmisión por secuencias.

Otra opción es usar un String o bytes, como se puede ver en el siguiente ejemplo:

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

Nota

Este enfoque también se puede utilizar para los valores que están almacenados en columnas text, ntext y nvarchar(max).

Si tiene en el servidor una biblioteca de imágenes y debe cargar archivos binarios completos en una columna varbinary(max), el método más eficaz con el controlador JDBC es usar directamente secuencias, como en el siguiente ejemplo:

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

El método CLOB o BLOB no es una forma eficaz de cargar grandes volúmenes de datos.

Modificación de tipos de valores grandes en una base de datos

En la mayoría de los casos, el método recomendado para cargar o modificar valores grandes de una base de datos es pasar parámetros a través de las clases SQLServerPreparedStatement y SQLServerCallableStatement usando comandos de Transact-SQL del tipo UPDATE, WRITE y SUBSTRING.

Si tiene que reemplazar la instancia de una palabra en un archivo grande de texto, como un archivo de almacenamiento HTML, puede usar un objeto Clob, como en el siguiente ejemplo:

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();

Además, podría hacer el trabajo en el servidor y pasar los parámetros a una instrucción UPDATE preparada.

Para obtener más información sobre tipos de valores grandes, consulte "Uso de tipos de valores grandes" en los Libros en pantalla de SQL Server.

Tipos de datos XML

SQL Server 2005 proporciona un tipo de datos xml que le permite almacenar documentos y fragmentos XML en una base de datos de SQL Server. El tipo de datos xml es un tipo de datos integrado de SQL Server y en cierta forma es similar a otros tipos integrados como int y varchar. Como sucede con otros tipos integrados, puede usar el tipo de datos xml como un tipo de columna cuando crea una tabla, como tipo de variable, tipo de parámetro o tipo de devolución de función, o en funciones CAST y CONVERT de Transact-SQL.

En el controlador JDBC, los tipos de datos xml se pueden asignar como una cadena, una matriz de bytes, una secuencia o un objeto CLOB o BLOB. Cadena es la representación predeterminada. La implementación de los tipos de datos xml en el controlador JDBC proporciona lo siguiente:

  • Acceso a XML como una cadena UTF-16 estándar de Java para la mayoría de las situaciones comunes de programación.

  • Compatibilidad con la escritura de UTF-8 y otros XML codificados de 8 bits.

  • Acceso a XML como una matriz de bytes con un BOM inicial, cuando está codificado en UTF-16 para el intercambio con otros procesadores de XML y archivos en discos.

SQL Server requiere un BOM inicial para XML codificado en UTF-16. La aplicación debe proporcionarlo cuando se suministran valores de parámetros XML como matrices de bytes. SQL Server siempre produce valores XML como cadenas de UTF-16 sin BOM o declaración de codificación integrada. Cuando se recuperan valores XML como byte[], BinaryStream o Blob, se agrega al principio del valor un BOM de UTF-16.

Nota

El controlador JDBC no es compatible con la lectura de parámetros de salida de procedimientos almacenados de los tipos de datos xml. No obstante, sí es compatible con el uso de los tipos de datos xml como parámetros de entrada. Si tiene que usar un tipo de datos xml como parámetro de salida, primero debe convertir el tipo de datos xml a VARCHAR o LONGVARCHAR en el procedimiento almacenado para poder leerlo.

Para obtener más información sobre los tipos de datos xml, vea "Tipos de datos XML" en los Libros en pantalla de SQL Server.

Tipos de datos definidos por el usuario

La introducción de tipos definidos por el usuario (UDT) en SQL Server 2005 amplia el sistema de tipos de SQL al permitirle almacenar estructuras de datos y objetos personalizados en una base de datos SQL Server. Los UDTs pueden contener múltiples tipos de datos y tener comportamientos, lo que los diferencia de los tipos de datos de alias tradicionales que se componen de un solo tipo de datos de sistema SQL Server. Los UDTs se definen con cualquiera de los lenguajes compatibles con el Common Language Runtime (CLR) Microsoft .NET que produzca código comprobable. Esto incluye Microsoft Visual C# y Visual Basic .NET. Los datos se exponen como campos y propiedades de una clase o una estructura basada en .NET Framework, y los comportamientos se definen con métodos de la clase o la estructura.

En SQL Server 2005, se pueden usar UDTs como definiciones de columnas de una tabla, como variables en un lote de Transact-SQL o como argumentos de una función o un procedimiento almacenado de Transact-SQL.

Nota

El controlador JDBC no es compatible con los métodos establecedores o captadores para los métodos AsciiStream y CharacterStream en columnas UDT. Además, de forma similar a lo que sucedía con los tipos de datos xml, el controlador JDBC no es compatible con la lectura de parámetros de salida de procedimientos almacenados del tipo de datos udt. No obstante, sí es compatible con el uso de los tipos de datos udt como parámetros de entrada. Si tiene que usar un tipo de datos udt como parámetro de salida, primero debe convertir el tipo de datos udt a varbinary(max) en el procedimiento almacenado para poder leerlo.

Para obtener más información sobre los tipos de datos definidos por el usuario, consulte "Usar y modificar instancias de tipos definidos por el usuario" en los Libros en pantalla de SQL Server.

Vea también

Otros recursos

Descripción de los tipos de datos del controlador JDBC