Verwenden von automatisch generierten Schlüsseln
Der Microsoft JDBC-Treiber für SQL Server unterstützt die optionalen JDBC 3.0-APIs für das Abrufen automatisch generierter Zeilenbezeichner. Der wichtigste Vorteil dieser Funktion besteht darin, eine Möglichkeit zu bieten, IDENTITY-Werte einer Anwendung zur Verfügung zu stellen, die eine Datenbanktabelle aktualisiert, ohne dass eine Abfrage und ein zweiter Roundtrip zum Server notwendig sind.
Da SQL Server keine Pseudospalten für Bezeichner unterstützt, müssen Updates, die das Feature für die automatische Generierung von Schlüsseln verwenden müssen, eine Tabelle verwenden, die eine IDENTITY-Spalte enthält. SQL Server lässt nur eine einzelne IDENTITY-Spalte pro Tabelle zu. Das von der getGeneratedKeys-Methode der SQLServerStatement-Klasse zurückgegebene Resultset enthält nur eine Spalte namens GENERATED_KEYS. Wenn generierte Schlüssel für eine Tabelle ohne IDENTITY-Spalte angefordert werden, gibt der JDBC-Treiber ein leeres Resultset zurück.
Erstellen Sie als Beispiel die folgende Tabelle in der AdventureWorks2022-Beispieldatenbank:
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
Im folgenden Beispiel wird eine offene Verbindung mit der AdventureWorks2022-Beispieldatenbank an die Funktion übergeben und eine SQL-Anweisung erstellt. Anschließend werden die Daten der Tabelle hinzugefügt, die Anweisung wird ausgeführt, und der Wert der IDENTITY-Spalte wird angezeigt.
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();
}
}