Verwenden von automatisch generierten Schlüsseln

JDBC-Treiber herunterladen

Der Microsoft JDBC-Treiber für SQL Server unterstützt die optionalen JDBC 3.0-APIs für das Abrufen automatisch generierter Zeilenbezeichner. Der Hauptvorteil dieser Funktion besteht darin, einer Anwendung, die eine Datenbanktabelle aktualisiert, IDENTITY-Werte zur Verfügung zu stellen, ohne dass dafür eine Abfrage und ein zweiter Hin- und Rückweg zum Server erforderlich sind.

Da SQL Server keine Pseudospalten für Identifikatoren unterstützt, müssen Updates, die die automatisch generierte Schlüsselfunktion verwenden, gegen eine Tabelle arbeiten, die eine Spalte IDENTITY enthält. SQL Server nur eine einzelne IDENTITY Spalte pro Tabelle zulässt. Die von der getGeneratedKeys-Methode der SQLServerStatement-Klasse zurückgegebene Ergebnismenge hat nur eine Spalte mit dem Spaltennamen GENERATED_KEYS. Ab JDBC Driver 13.6 gibt der Treiber, wenn generierte Schlüssel für eine Anweisung angefordert werden, die keinen IDENTITY Wert erzeugt, eine nicht-nulle, leere Ergebnismenge zurück und ResultSet.next() gibt false.

Erstellen Sie beispielsweise die folgende Tabelle in der AdventureWorks2025-Beispieldatenbank:

CREATE TABLE TestTable
   (Col1 int IDENTITY,
    Col2 varchar(50),
    Col3 int);  

Im folgenden Beispiel wird eine offene Verbindung mit der AdventureWorks2025-Beispieldatenbank an die Funktion übergeben, eine SQL-Anweisung wird erstellt, mit der der Tabelle Daten hinzugefügt werden. Anschließend wird die Anweisung ausgeführt, und der IDENTITY Spaltenwert 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();
    }
}