Použití automaticky generovaných klíčů

Stáhnout ovladač JDBC

Ovladač Microsoft JDBC pro SQL Server podporuje volitelná rozhraní API JDBC 3.0 pro načtení automaticky generovaných identifikátorů řádků. Hlavní hodnotou této funkce je poskytnout způsob, jak zpřístupnit IDENTITY hodnoty aplikaci, která aktualizuje tabulku databáze, aniž by vyžadovala dotaz a druhou odezvu na server.

Vzhledem k tomu, že SQL Server nepodporuje pseudosloupce identifikátorů, musí aktualizace, které musí používat funkci automaticky vygenerovaného klíče, pracovat s tabulkou, která obsahuje IDENTITY sloupec. SQL Server umožňuje pouze jeden IDENTITY sloupec na tabulku. Sada výsledků vrácená metodou getGeneratedKeys třídy SQLServerStatement bude mít pouze jeden sloupec s vráceným názvem sloupce GENERATED_KEYS. Pokud jsou vygenerované klíče požadovány v tabulce, která nemá žádný IDENTITY sloupec, ovladač JDBC vrátí sadu výsledků null.

V ukázkové databázi AdventureWorks2025 vytvořte například následující tabulku:

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

V následujícím příkladu se do funkce předá otevřené připojení k ukázkové databázi AdventureWorks2025, vytvoří se příkaz SQL, který přidá data do tabulky a potom se příkaz spustí a IDENTITY zobrazí se hodnota sloupce.

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();
    }
}