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

PreparedStatement 參數為 null 導致資料庫非空約束違反

     編輯:程式設計綜合問答

錯誤現象

執行 PreparedStatement 插入/更新時拋出 SQLException,提示欄位不能為 null (ORA-01400 / MySQL 1048 / SQL Server 515)。

根因

String aname = request.getParameter("aname"); // 取得 null
pstmt.setString(1, aname); // 設定給 NOT NULL 欄位
pstmt.executeUpdate();     // 資料庫拋錯

request.getParameter("aname") 回傳 null 的情況:

  • 表單欄位名稱拼寫錯誤 (如 name="anamee")。
  • 請求根本未包含該參數 (GET 查詢字串缺失、POST Body 解析失敗)。
  • 前端 JavaScript 未正確組裝表單資料。

排查與修正步驟

  1. 後端防禦性檢查:
    String aname = request.getParameter("aname");
    if (aname == null || aname.trim().isEmpty()) {
        // 回傳 400 錯誤或設定預設值
        response.sendError(HttpServletResponse.SC_BAD_REQUEST, "缺少必要參數 aname");
        return;
    }
    
  2. 前端確認: 瀏覽器 DevTools Network 面板檢查實際發送的 Request Payload / Query String 是否包含 aname=xxx。
  3. 資料庫端: 若業務允許空值,修改欄位定義 ALTER TABLE ... MODIFY aname VARCHAR(100) NULL;否則必須在應用層保證非空。

最佳實踐

  • 所有外部輸入 (request.getParameter, @RequestParam, JSON 反序列化) **一律視為不可信**,驗證非空、長度、格式後再進入資料層。
  • 使用 Bean Validation (JSR-380) @NotNull, @Size 等註解聲明式驗證,統一攔截處理。

核心口訣:參數為 null 非資料庫錯,乃應用層驗證缺失。

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