m-namikiの日記

おもしろき こともなき世を おもしろく

SQL Serverで自動生成キーの取得

SQL Server 2005で、IDENTITY値を利用したテーブルに対して Insertを行った場合に、生成されたキーを取得する方法のメモ。いまのプロジェクトではdbutilsを利用しているので、QueryRunnerをオーバーライドして、専用のQueryRunnerを作成した。

public class GeneratedKeysReturnQueryRunner extends QueryRunner {

    @Override
    public int update(Connection conn, String sql, Object[] params)
            throws SQLException {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        ResultSetMetaData meta = null;
        int key = 0;
        try {
            stmt = this.prepareStatement(conn, sql);
            this.fillStatement(stmt, params);
            stmt.executeUpdate();
            rs = stmt.getGeneratedKeys();
            meta = rs.getMetaData();
            if (rs.next()) {
                key = rs.getInt(meta.getColumnCount());
            }
        } catch (SQLException e) {
            this.rethrow(e, sql, params);
        } finally {
            close(stmt);
        }
        return key;
    }

    @Override
    protected PreparedStatement prepareStatement(Connection conn, String sql)
            throws SQLException {
        return conn.prepareStatement(sql,
                PreparedStatement.RETURN_GENERATED_KEYS);
    }
}

J2SE1.4以上がサポートしているJDBC 3.0 APIにある、PreparedStatement.RETURN_GENERATED_KEYSがポイント。PostgreSQLMySQLOracleで同じようなことが出来るのかは未検証。
via MSDN 自動生成キーの使用