Verwenden von automatisch generierten Schlüsseln
Der Microsoft SQL Server 2005 JDBC Driver unterstützt die optionalen JDBC 3.0-APIs für den Abruf von automatisch generierten Zeilen-IDs. Der Hauptwert dieses Feature 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 IDs unterstützt, müssen Aktualisierungen, 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 lediglich eine einzige IDENTITY-Spalte pro Tabelle zu. Das von der getGeneratedKeys-Methode der SQLServerStatement-Klasse zurückgegebene Resultset enthält nur eine Spalte mit dem Namen 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 SQL Server 2005 AdventureWorks-Beispieldatenbank:
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
Im folgenden Beispiel werden eine offene Verbindung zur AdventureWorks AdventureWorks-Beispieldatenbank an die Funktion übergeben, eine SQL-Anweisung erstellt, die Daten zu der Tabelle hinzufügt, die Anweisung anschließend ausgeführt und der Wert der IDENTITY-Spalte angezeigt.
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();
}
}