問題背景
使用 ADO (ActiveX Data Objects) 連接資料庫時,捕獲到異常,想知道具體是斷網、SQL 錯誤、資料庫服務未啟動、認證失敗等哪種原因。
現實限制
- 網路層面錯誤(斷網、防火牆、服務未啟):通常統一拋出 連接逾時 或 無法連接到伺服器,錯誤碼相似(如 `0x80004005`、`08001`),難以精確區分是「網路不通」還是「SQL Server 服務掛了」。
- SQL 語法/語義錯誤:執行 `Execute` 時拋出,錯誤訊息明確包含 SQL 錯誤碼、行號、關鍵字,易識別。
- 認證失敗:登入失敗,錯誤訊息含 "Login failed for user"。
- 權限不足:權限相關錯誤碼。
建議處理策略
- 分層捕獲:
try {
conn.Open();
} catch (COMException ex) when ((uint)ex.ErrorCode == 0x80004005) {
// 通用連接失敗,記錄日誌,提示使用者檢查網路/服務
} catch (Exception ex) {
// 其他
}
- 錯誤碼對照表:參考 ADO 錯誤碼文件,常見:
- `0x80004005` - 一般失敗(連接字串錯、網路、服務)
- `0x80040E4D` - 登入失敗
- `0x80040E14` - SQL 語法錯誤
- 補充偵測:連接前先 `Ping` 主機、嘗試 TCP 連接埠 1433,若通則傾向資料庫服務問題;若不通則為網路/防火牆。
- 使用較新技術:ADO.NET (`SqlConnection`) 提供更豐富的 `SqlException.Number`(對應 SQL Server 錯誤碼),更易區分原因。
結論
ADO 層面難以完美區分「斷網」與「資料庫服務異常」,建議結合網路層偵測、錯誤碼判斷、詳細日誌記錄,並在上層應用給使用者統一友善提示(如「無法連接資料庫,請檢查網路或聯繫管理員」)。