Uso delle chiavi generate automaticamente
Il JDBC Driver per SQL Server supporta le API JDBC 3.0 facoltative per il recupero degli identificatori di riga generati automaticamente. Il valore principale di questa funzionalità è di consentire la disponibilità dei valori IDENTITY all'applicazione con la quale si sta aggiornando una tabella di database senza richiedere una query e un secondo round trip al server.
Poiché Microsoft SQL Server non supporta pseudocolonne per gli identificatori, gli aggiornamenti per i quali si usa la funzionalità di generazione automatica delle chiavi funzionano solo in una tabella che contiene una colonna IDENTITY. Microsoft SQL Server consente una singola colonna IDENTITY per tabella. Il set di risultati restituito dal metodo getGeneratedKeys della classe SQLServerStatement conterrà una sola colonna, con GENERATED_KEYS come nome di colonna restituito. Se le chiavi generate vengono richieste in una tabella che non contiene la colonna IDENTITY, il driver JDBC restituirà un set di risultati con valore Null.
Ad esempio, creare la seguente tabella nel database di esempio AdventureWorks2022:
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
Nell'esempio seguente viene passata una connessione aperta al database di esempio AdventureWorks2022 alla funzione , viene costruita un'istruzione SQL che aggiunge dati alla tabella e quindi viene eseguita l'istruzione e viene visualizzato il valore della colonna IDENTITY.
public static void executeInsertWithKeys(Connection con) {
try(Statement stmt = con.createStatement();) {
String SQL = "INSERT INTO TestTable (Col2, Col3) VALUES ('S', 50)";
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.");
}
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}