兩大連接架構
- JDBC-ODBC Bridge:
sun.jdbc.odbc.JdbcOdbcDriver + 系統 DSN。相容舊資料源 (Excel/Access),效能差、已移除於 Java 8+。
- 純 Java JDBC:Microsoft 官方驅動 / jTDS。效能佳、型別支援完整、生產首選。
JDBC-ODBC Bridge 設定步驟 (圖解摘要)
- 控制台 → 系統管理工具 → 資料來源 (ODBC) → 系統 DSN → 新增。
- 選 SQL Server → 完成。
- 名稱
ODBC_SQL_SERVER、伺服器選擇本機/遠端實例。
- 驗證:SQL Server 驗證、登入
sa、密碼。
- 預設資料庫選擇目標 DB。
- 完成 → 測試資料來源 成功。
測試程式碼
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection(
"jdbc:odbc:ODBC_SQL_SERVER;user=sa;password=891004");
// 或使用 Properties 傳遞帳密
純 Java JDBC:SQL Server 2000 vs 2005+ 差異
| 項目 | SQL Server 2000 | SQL Server 2005+ |
| 驅動 JAR | msbase.jar, mssqlserver.jar, msutil.jar (3 檔) | sqljdbc.jar / mssql-jdbc.jar (單檔) |
| 驅動類別 | com.microsoft.jdbc.sqlserver.SQLServerDriver | com.microsoft.sqlserver.jdbc.SQLServerDriver |
| JDBC URL | jdbc:microsoft:sqlserver://IP:1433;DatabaseName=DB | jdbc:sqlserver://IP:1433;databaseName=DB |
| 必要修補 | SP3a + JDBC Driver SP3 | SP3 + CU / 最新累積更新 |
SQL Server 2000 完整範例
String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=tavi";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, "sa", "");
// 輸出 "Connection Successful!"
SQL Server 2005+ 完整範例
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=tavi";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, "sa", "891004");
// 輸出 "Connection Successful!"
常見連線失敗排查
netstat -an | findstr 1433 確認埠監聽。
- SQL Server Configuration Manager → TCP/IP 啟用、IPAll 埠 1433、重啟服務。
- Surface Area Configuration → 遠端連接啟用 TCP/IP。
- 防火牆開放 1433 (TCP)、1434 (UDP Browser)。
- 驅動版本與伺服器版本匹配 (2000 驅動不可連 2005+ 實例,反之亦然)。
- 安裝對應 Service Pack (2000 SP4、2005 SP3+)。
現代化建議 (Java 8+)
- **棄用 JDBC-ODBC Bridge** (Java 8 移除)。
- 採用 **Microsoft JDBC Driver for SQL Server** (GitHub/Maven Central) 或 **jTDS** (輕量、相容佳)。
- 連線池:**HikariCP** (預設) / **Druid** (監控強)。
- URL 範例:
jdbc:sqlserver://host:1433;database=DB;encrypt=true;trustServerCertificate=false;