首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Access/JDBC 刪除資料全刪除?小心 SQL 參數拼接陷阱

     編輯:程式設計疑難解答

問題現場

使用 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 欄位」,恆真,導致全表刪除。

正確做法:PreparedStatement 參數綁定

String sql = "DELETE FROM T_EMPLOYER WHERE ID = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, id); // 或 setInt 視型別而定
int rows = ps.executeUpdate();
  • ? 為參數佔位符,由驅動程式安全轉義、型別檢查。
  • 杜絕 SQL 注入,修正邏輯錯誤。

補充:Access 保留字與欄位名

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 習慣,兼顧安全與正確。

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