Microsoft SQL Server 2005 JDBC Driver 1.1 完整支援 JDBC 3.0 `getGeneratedKeys()`,實現跨資料庫統一代碼。
# 下載 (舊版連結,現建議用最新 12.x 版本)
# https://download.microsoft.com/download/.../sqljdbc_1.1.1501.101_chs.exe
| 項目 | SQL Server 2000 驅動 | SQL Server 2005 驅動 |
|---|---|---|
| JDBC URL | `jdbc:microsoft:sqlserver://host:1433;DatabaseName=db` | `jdbc:sqlserver://host:1433;DatabaseName=db` |
| Driver Class | `com.microsoft.jdbc.sqlserver.SQLServerDriver` | `com.microsoft.sqlserver.jdbc.SQLServerDriver` |
| Jar 檔 | `msbase.jar`, `mssqlserver.jar`, `msutil.jar` | `sqljdbc.jar` (單檔) |
⚠️ 類名 `jdbc`/`sqlserver` 順序互換,極易寫錯導致 `ClassNotFoundException`。
public String executeInsertReturnKey(String sql) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
// 關鍵:Statement.RETURN_GENERATED_KEYS
pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();
try (ResultSet rs = pstmt.getGeneratedKeys()) {
if (rs.next()) {
return rs.getString(1); // 取第一欄自增值
}
}
return "-1"; // 未取得
} catch (SQLException e) {
throw new SQLException("執行失敗: " + e.getMessage() + " SQL: " + sql, e);
} finally {
closeQuietly(pstmt, conn);
}
}
| 資料庫 | 驅動版本 | 支援 getGeneratedKeys | 備註 |
|---|---|---|---|
| SQL Server 2005+ | sqljdbc 1.1+ | ✅ | 單檔 jar,URL/Class 全變 |
| MySQL | Connector/J 3.1+ | ✅ | 需 URL 加 `useGeneratedKeys=true` |
| PostgreSQL | JDBC 4.0+ | ✅ | 支援 `RETURNING` 子句 |
| Oracle | ojdbc6+ | ⚠️ 部分 | 需指定索引/欄位名 `prepareStatement(sql, new String[]{"ID"})` |