首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2005 JDBC 驅動統一處理自動增長欄位(getGeneratedKeys 實戰)

     編輯:關於SqlServer

背景與痛點

多資料庫支援系統中,INSERT 後取得自動增長鍵值的方式不一:

  • SQL Server 2000:`INSERT ... SELECT @@IDENTITY` 或 `SCOPE_IDENTITY()`
  • MySQL:`executeUpdate()` 後 `executeQuery('SELECT LAST_INSERT_ID()')`
  • 分離兩步驟在高併發下存在競態風險。

JDBC 3.0 引入 Statement.getGeneratedKeys() 標準化此需求,但 SQL Server 2000 驅動不支援。SQL Server 2005 JDBC 驅動(版本 1.1+)完整支援 JDBC 3.0,成為統一解決方案的關鍵。

驅動下載與環境準備

關鍵差異:2000 vs 2005 驅動

項目SQL Server 2000 驅動SQL Server 2005 驅動
JDBC 版本2.03.0(支援 getGeneratedKeys)
URL 格式jdbc:microsoft:sqlserver://host:1433;DatabaseName=dbjdbc:sqlserver://host:1433;DatabaseName=db
Driver Classcom.microsoft.jdbc.sqlserver.SQLServerDrivercom.microsoft.sqlserver.jdbc.SQLServerDriver
套件結構com.microsoft.jdbc.*com.microsoft.sqlserver.*

⚠️ 常見錯誤:URL 或 Driver Class 混用 2000/2005 格式會導致 ClassNotFoundException 或 Cannot load JDBC driver。

統一程式碼範例

public String executeInsert(String sql) throws SQLException {
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    try {
        conn = getConnection();  // 自行實現連線池取得
        // 關鍵:指定 RETURN_GENERATED_KEYS
        pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        pstmt.executeUpdate();

        rs = pstmt.getGeneratedKeys();  // 取得自動產生的鍵值 ResultSet
        if (rs.next()) {
            return rs.getString(1);  // 通常第 1 欄為身分識別欄
        }
        return "-1";
    } catch (SQLException ex) {
        throw new SQLException("執行 SQL 失敗: " + ex.getMessage() + " sql: " + sql, ex);
    } finally {
        closeQuietly(rs);
        closeQuietly(pstmt);
        closeQuietly(conn);
    }
}

注意事項

  1. prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) 必須指定,否則 `getGeneratedKeys()` 拋出「只有運行該語句,生成的鍵才會可用」。
  2. 僅對含 IDENTITY 欄位的 INSERT 有效;若為 `INSERT ... SELECT` 或合併語句行為視驅動版本而定。
  3. SQL Server 2005+ 也支援 `SCOPE_IDENTITY()`、`IDENT_CURRENT()`,但 `getGeneratedKeys()` 為跨資料庫統一介面的最佳選擇。

小結

升級至 SQL Server 2005 JDBC 驅動,配合 JDBC 3.0 標準介面,即可在多資料庫架構中以同一套程式碼安全、高效地取得自動增長鍵值,消除併發風險與程式碼分支。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved