使用 JDBC-ODBC Bridge 連 Access,執行:
String sql = "DELETE FROM T_EMPLOYER WHERE ID=id";
結果「全部刪除」,改成 WHERE T_EMPLOYER.ID=10 才正常。為何?
原始碼中 id 是 Java 變數,但直接寫在 SQL 字串裡,並非參數佔位符。最終送給資料庫的 SQL 變成:
DELETE FROM T_EMPLOYER WHERE ID=id
資料庫將右邊 id 視為欄位名,而非數值。條件變成「ID 欄位等於 ID 欄位」,恆真,導致全表刪除。
String sql = "DELETE FROM T_EMPLOYER WHERE ID = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, id); // 或 setInt 視型別而定
int rows = ps.executeUpdate();
? 為參數佔位符,由驅動程式安全轉義、型別檢查。Access 中 ID、NAME 等常見詞可能為保留字。建議加方括號:
DELETE FROM T_EMPLOYER WHERE [ID] = ?
| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
WHERE ID=id | 視為欄位比較 | WHERE ID = ? + setXxx |
WHERE ID=' + id + ' | 字串拼接,注入風險 | 同上 |
| 未關閉 Statement/Connection | 資源洩漏 | try-with-resources 或 finally 關閉 |
「全部刪除」非資料庫 Bug,乃參數化查詢缺失導致邏輯誤判。養成 PreparedStatement 習慣,兼顧安全與正確。