Usar claves generadas automáticamente
El controlador JDBC de Microsoft SQL Server admite las API de JDBC 3.0 opcionales para recuperar los identificadores de fila generados automáticamente. El valor principal de esta característica es proporcionar un método de modo que los valores IDENTITY estén disponibles para la aplicación que actualiza la tabla de base de datos sin necesidad de una consulta y un segundo ciclo de ida y vuelta en el servidor.
Dado que SQL Server no admite pseudocolumnas para los identificadores, las actualizaciones en que se debe usar la característica de clave generada automáticamente deben funcionar en una tabla que contenga una columna IDENTITY. SQL Server permite una sola columna IDENTITY por tabla. El conjunto de resultados devuelto por el método getGeneratedKeys de la clase SQLServerStatement contiene tan solo una columna y se devuelve el nombre de columna GENERATED_KEYS. Si las claves generadas se solicitan en una tabla que no contiene la columna IDENTITY, el controlador JDBC devuelve un conjunto de resultados con valores nulos.
A modo de ejemplo, cree la siguiente tabla en la base de datos de ejemplo AdventureWorks de SQL Server 2005:
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
En el siguiente ejemplo, se pasa una conexión abierta a la base de datos de ejemplo AdventureWorks a la función, se genera una instrucción SQL que agregará datos a la tabla y, a continuación, la instrucción se ejecuta y se muestra el valor de la columna IDENTITY.
public static void executeInsertWithKeys(Connection con) {
try {
String SQL = "INSERT INTO TestTable (Col2, Col3) VALUES ('S', 50)";
Statement stmt = con.createStatement();
int count = stmt.executeUpdate(SQL, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
do {
for (int i=1; i<=columnCount; i++) {
String key = rs.getString(i);
System.out.println("KEY " + i + " = " + key);
}
} while(rs.next());
}
else {
System.out.println("NO KEYS WERE GENERATED.");
}
rs.close();
stmt.close();
}
catch (Exception e) {
e.printStackTrace();
}
}