Empleo de tipos de datos básicos
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 parametrizadas, consulte Uso de 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.