2010/02/03

SQLServerで自動生成キーの取得

SQLServer2005で、IDENTITY値を利用したテーブルに対してInsertを行った場合に、生成されたキーを取得する方法です。いまのプロジェクトではdbutilsを利用しているので、QueryRunnerをオーバーライドして、専用のQueryRunnerを作成しました。
  1. public class GeneratedKeysReturnQueryRunner extends QueryRunner {  
  2.   
  3.     @Override  
  4.     public int update(Connection conn, String sql, Object[] params)  
  5.             throws SQLException {  
  6.         PreparedStatement stmt = null;  
  7.         ResultSet rs = null;  
  8.         ResultSetMetaData meta = null;  
  9.         int key = 0;  
  10.         try {  
  11.             stmt = this.prepareStatement(conn, sql);  
  12.             this.fillStatement(stmt, params);  
  13.             stmt.executeUpdate();  
  14.             rs = stmt.getGeneratedKeys();  
  15.             meta = rs.getMetaData();  
  16.             if (rs.next()) {  
  17.                 key = rs.getInt(meta.getColumnCount());  
  18.             }  
  19.         } catch (SQLException e) {  
  20.             this.rethrow(e, sql, params);  
  21.         } finally {  
  22.             close(stmt);  
  23.         }  
  24.         return key;  
  25.     }  
  26.   
  27.     @Override  
  28.     protected PreparedStatement prepareStatement(Connection conn, String sql)  
  29.             throws SQLException {  
  30.         return conn.prepareStatement(sql,  
  31.                 PreparedStatement.RETURN_GENERATED_KEYS);  
  32.     }  
  33. }  

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

0 件のコメント:

コメントを投稿