Empleo de tipos de datos básicos

Descargar controlador JDBC

Microsoft JDBC Driver para SQL Server usa tipos de datos básicos de JDBC para convertir los tipos de datos de SQL Server a un formato que el lenguaje de programación Java pueda entender y viceversa. El controlador JDBC proporciona compatibilidad con la API de JDBC 4.0, que incluye el tipo de datos SQLXML y tipos de datos nacionales (Unicode), como NCHAR, NVARCHAR, LONGNVARCHAR y NCLOB.

Asignaciones de tipo de datos

En la siguiente tabla se muestran las asignaciones predeterminadas entre los tipos de datos de SQL Server básicos, JDBC y del lenguaje de programación Java:

Tipos de SQL Server Tipos de JDBC (Tipos de java.sql.) Tipos del lenguaje Java
bigint bigint long
binary BINARY byte[]
bit BIT boolean
char CHAR String
date DATE java.sql.Date
datetime3 timestamp java.sql.Timestamp
datetime2 timestamp java.sql.Timestamp
datetimeoffset2 microsoft.sql.Types.DATETIMEOFFSET microsoft.sql.DateTimeOffset
Decimal DECIMAL java.math.BigDecimal
FLOAT DOUBLE double
imagen LONGVARBINARY byte[]
int INTEGER int
money DECIMAL java.math.BigDecimal
NCHAR CHAR

NCHAR (Java SE 6.0)
String
ntext LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String
NUMERIC NUMERIC java.math.BigDecimal
NVARCHAR VARCHAR

NVARCHAR (Java SE 6.0)
String
nvarchar(max) VARCHAR

NVARCHAR (Java SE 6.0)
String
real real FLOAT
smalldatetime timestamp java.sql.Timestamp
SMALLINT SMALLINT short
SMALLMONEY DECIMAL java.math.BigDecimal
text LONGVARCHAR String
time TIME1 java.sql.Time1
timestamp BINARY byte[]
TINYINT TINYINT short
udt VARBINARY byte[]
UNIQUEIDENTIFIER CHAR String
varbinary VARBINARY byte[]
varbinary(max) VARBINARY byte[]
varchar VARCHAR String
ntext VARCHAR String
Xml LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String

SQLXML
sqlvariant microsoft.sql.Types.SQL_VARIANT Object
geometry VARBINARY byte[]
geography VARBINARY byte[]

1 Para usar java.sql.Time con el tipo de hora SQL Server, debe establecer la propiedad de conexión sendTimeAsDatetime en False.

2 Puede tener acceso mediante programación a los valores de datetimeoffset con la clase DateTimeOffset.

3 Los valores java.sql.Timestamp ya no se pueden usar para comparar los valores de una columna datetime a partir de SQL Server 2016. Esta limitación se debe a un cambio en el servidor que convierte datetime en datetime2 de manera diferente, lo que da como resultado valores que no son iguales. La solución a este problema es cambiar las columnas datetime a datetime2(3), usar una cadena en lugar de java. sql.Timestamp o cambiar el nivel de compatibilidad de la base de datos a 120 o inferior.

Las siguientes secciones proporcionan ejemplos de cómo puede usar el controlador JDBC y los tipos de datos básicos. Si quiere obtener un ejemplo detallado sobre cómo usar los tipos de datos básicos en una aplicación de Java, consulte Ejemplo de tipos de datos básicos.

Recuperar datos como una cadena

Si tiene que recuperar datos de un origen de datos que se asigne a cualquiera de los tipos de datos básicos de JDBC para verlos como una cadena, o si no se necesitan datos fuertemente tipados, use el método getString de la clase SQLServerResultSet. Este uso se muestra en el ejemplo siguiente:

try(Statement stmt = con.createStatement();) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    short empJobID = rs.getString("job_id");
}

Recuperar datos por tipo de datos

Si tiene que recuperar datos de un origen de datos y sabe el tipo de datos que se van a recuperar, use uno de los métodos get<Type> de la clase SQLServerResultSet, también conocidos como métodos de captador. Con los métodos get<Type>, puede usar un nombre de columna o un índice de columna, como en el siguiente ejemplo:

try(Statement stmt = con.createStatement();) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    short empJobID = rs.getShort("job_id");
}

Nota:

Los métodos con escala getUnicodeStream y getBigDecimal están obsoletos y el controlador JDBC no los admite.

Actualizar datos por tipo de datos

Si tiene que actualizar el valor de un campo en un origen de datos, use uno de los métodos update<Type> de la clase SQLServerResultSet. En el siguiente ejemplo, se usa el método updateInt con el método updateRow para actualizar los datos del origen de datos:

try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    int empJobID = rs.getInt(2);
    empJobID++;
    rs.first();
    rs.updateInt(2, empJobID);
    rs.updateRow();
}

Nota:

El controlador JDBC no puede actualizar una columna SQL Server con un nombre de columna que tenga más de 127 caracteres de largo. Si se intenta una actualización a una columna cuyo nombre tenga más de 127 caracteres, se genera una excepción.

Actualizar datos por consulta con parámetros

Si actualiza datos de un origen de datos mediante el uso de una consulta con parámetros, puede establecer el tipo de datos de los parámetros con los métodos set<Type> de la clase SQLServerPreparedStatement. Estos métodos también se conocen como métodos de establecedor. En el siguiente ejemplo, se usa el método prepareStatement para precompilar la consulta con parámetros y, luego, el método setString para establecer el valor de cadena del parámetro antes de llamar al método executeUpdate.

try(PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET fname = ? WHERE (lname = 'Brown')");) {
    String name = "Bob";
    pstmt.setString(1, name);
    int rowCount = pstmt.executeUpdate();
}

Para obtener más información sobre las consultas con parámetros, consulte Usar una instrucción SQL con parámetros.

Pasar parámetros a un procedimiento almacenado

Si tiene que pasar parámetros tipados a un procedimiento almacenado, puede establecerlos por índice o por nombre mediante el uso de uno de los métodos set<Type> de la clase SQLServerCallableStatement. En el siguiente ejemplo, se usa el método prepareCall para configurar la llamada al procedimiento almacenado y, luego, el método setString para establecer el parámetro para la llamada antes de llamar al método executeQuery.

try(CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}");) {
    String lname = "Brown";
    cstmt.setString(1, lname);
    ResultSet rs = cstmt.executeQuery();
}

Nota

En este ejemplo, se devuelve un conjunto de resultados con los resultados de la ejecución del procedimiento almacenado.

BigDecimal

Cuando se usan valores de parámetro BigDecimal, pase la precisión y la escala del valor junto con el valor a través de setBigDecimal. El uso de setBigDecimal de esta manera evita el posible truncamiento de valores. Como alternativa, si la opción calcBigDecimalPrecision de cadena de conexión está establecida en true, el controlador calculará la precisión de la entrada BigDecimal en nombre del usuario, a costa del rendimiento. Si el valor se pasa solo sin establecer calcBigDecimalPrecision o la opción establecida en false, el controlador asume el valor máximo permitido (38) para obtener precisión para ese valor BigDecimal.

Para obtener más información sobre el uso del controlador JDBC con procedimientos almacenados y parámetros de entrada, consulte Empleo de un procedimiento almacenado con parámetros de entrada.

Recuperar parámetros desde un procedimiento almacenado

Si tiene que recuperar parámetros de un procedimiento almacenado, primero debe registrar un parámetro out por el nombre o el índice con el método registerOutParameter de la clase SQLServerCallableStatement. A continuación, asigne el parámetro devuelto a una variable adecuada después de ejecutar la llamada al procedimiento almacenado. En el siguiente ejemplo, se usa el método prepareCall para configurar la llamada al procedimiento almacenado, el método registerOutParameter para configurar el parámetro out y el método setString para establecer el parámetro para la llamada antes de llamar al método executeQuery. El valor que devuelve el parámetro out del procedimiento almacenado se recupera con el método getShort.

try(CallableStatement cstmt = con.prepareCall("{call employee_jobid (?, ?)}");) {
    cstmt.registerOutParameter(2, java.sql.Types.SMALLINT);
    String lname = "Brown";
    cstmt.setString(1, lname);
    ResultSet rs = cstmt.executeQuery();
    short empJobID = cstmt.getShort(2);
}

Nota:

Además del parámetro de salida devuelto, puede que también se devuelva un conjunto de resultados con los resultados de ejecución del procedimiento almacenado.

Para obtener más información sobre el uso del controlador JDBC con procedimientos almacenados y parámetros de salida, consulte Empleo de un procedimiento almacenado con parámetros de salida.

Consulte también

Descripción de los tipos de datos del controlador JDBC