Usar tipos de datos avanzados

El controlador JDBC de Microsoft SQL Server 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 pueda 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[] (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

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

Tipos de datos BLOB, CLOB y NCLOB

El controlador JDBC implementa todos los métodos de las interfaces java.sql.Blob, java.sql.Clob y java.sql.NClob.

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 usar con los tipos de datos varchar(max) y nvarchar(max), los tipos BLOB se pueden usar con los tipos de datos varbinary(max) y image y los tipos NCLOB se pueden usar con ntext y nvarchar(max).

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 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.

Recuperar 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:

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

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:

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

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

Desde SQL Server 2005, SQL Server 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, el tipo de datos xml se puede asignar como una cadena, una matriz de bytes, una secuencia o un objeto CLOB, BLOB o SQLXML. Cadena es la asignación predeterminada. Desde la versión 2.0 del controlador JDBC, este controlador proporciona compatibilidad con la API de JDBC 4.0, que presenta la interfaz SQLXML. La interfaz SQLXML define métodos para interactuar con los datos XML y manipularlos. El tipo de datos SQLXML se asigna al tipo de datos xml de SQL Server. Para obtener más información acerca de cómo leer y escribir datos XML desde y en una base de datos relacional con el tipo de datos Java de SQLXML, vea Compatibilidad con datos XML.

La implementación de los tipos de datos xml del controlador JDBC proporciona compatibilidad para 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.

Para obtener más información acerca de 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 UDT se definen con cualquiera de los lenguajes compatibles con Microsoft .NET Common Language Runtime (CLR) que producen 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, se pueden usar los UDT como definiciones de columnas de una tabla, como una variable de un lote de Transact-SQL o como un argumento de una función o un procedimiento almacenado de Transact-SQL.

Para obtener más información acerca de 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

Describir los tipos de datos del controlador JDBC