El Controlador Microsoft JDBC para SQL Server usa los 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 los tipos de datos SQLXML y tipos de datos nacionales (Unicode), como NCHAR, NVARCHAR, LONGNVARCHAR y NCLOB.
Asignaciones de tipo de datos
La siguiente tabla muestra 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 |
datetime | TIMESTAMP | java.sql.Timestamp |
datetime2 | TIMESTAMP | java.sql.Timestamp |
datetimeoffset (2) | microsoft.sql.Types.DATETIMEOFFSET | microsoft.sql.DateTimeOffset |
decimal | DECIMAL | java.math.BigDecimal |
float | DOUBLE | double |
image | LONGVARBINARY | byte[] |
int | INTEGER | int |
money | DECIMAL | java.math.BigDecimal |
nchar | CHAR SQLXML (Java SE 6.0) | String |
ntext | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) | String |
numeric | NUMERIC | java.math.BigDecimal |
nvarchar | VARCHAR LONGNVARCHAR (Java SE 6.0) | String |
nvarchar(max) | VARCHAR LONGNVARCHAR (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 | TIME (1) | java.sql.Time (1) |
timestamp | BINARY | byte[] |
tinyint | TINYINT | short |
udt | VARBINARY | byte[] |
uniqueidentifier | CHAR | String |
varbinary | VARBINARY | byte[] |
varbinary(max) | VARBINARY | byte[] |
varchar | VARCHAR | String |
varchar(max) | VARCHAR | String |
xml | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) | String SQLXML |
(1) Para utilizar java.sql.Time con el tipo de hora de 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 Clase DateTimeOffset.
El tipo de datos sqlvariant de SQL Server no es compatible actualmente con el controlador JDBC. Si se usa una consulta para recuperar datos de una tabla que contenga una columna del tipo de datos sqlvariant, se producirá una excepción.
Las siguientes secciones proporcionan ejemplos de cómo puede usar el controlador JDBC y los tipos de datos básicos. Si desea 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 asignen a cualquiera de los tipos de datos básicos de JDBC para verlos como una cadena, o si no son necesarios datos de tipos muy marcados, puede usar el método getString de la clase SQLServerResultSet, como en el siguiente ejemplo:
String SQL = "SELECT TOP 10 * FROM Person.Contact"; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(SQL); while (rs.next()) { System.out.println(rs.getString(4) + " " + rs.getString(6)); } rs.close(); stmt.close();
Recuperar datos por tipos 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:
ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')"); rs.next(); short empJobID = rs.getShort("job_id"); rs.close(); stmt.close();
Los métodos con escala getUnicodeStream y getBigDecimal están obsoletos y el controlador JDBC no los admite.
Actualizar datos por tipos 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 en conjunción con el método updateRow para actualizar los datos del origen de datos:
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(); short empJobID = rs.getInt(2); empJobID++; rs.first(); rs.updateInt(2, empJobID); rs.updateRow(); rs.close(); stmt.close();
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 mediante una consulta con parámetros
Si tiene que actualizar 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, también conocidos 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.
PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET fname = ? WHERE (lname = 'Brown')"); String first = "Bob"; pstmt.setString(1, first); int rowCount = pstmt.executeUpdate(); pstmt.close();
Para obtener más información sobre consultas con parámetros, vea Usar una instrucción SQL con parámetros.
Pasar de parámetros a un procedimiento almacenado
Si tiene que pasar parámetros de tipo 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.
CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}"); String lname = "Brown"; cstmt.setString(1, lname); Resultset rs = cstmt.executeQuery(); rs.close(); cstmt.close();
En este ejemplo, se devuelve un conjunto de resultados con los resultados de la ejecución del procedimiento almacenado.
Para obtener más información sobre el uso del controlador JDBC con procedimientos almacenados y parámetros de entrada, consulte Usar un procedimiento almacenado con parámetros de entrada.
Recuperación de parámetros desde un procedimiento almacenado
Si tiene que recuperar parámetros desde un procedimiento almacenado, primero debe registrar un parámetro de salida por el nombre o el índice con el método registerOutParameter de la clase SQLServerCallableStatement y, a continuación, asignar el parámetro de salida devuelto a una variable adecuada después de haber ejecutado 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 de salida 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 de salida del procedimiento almacenado se recupera con el método getShort.
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); rs.close(); cstmt.close();
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 Usar un procedimiento almacenado con parámetros de salida.