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

JDBC 插入 Oracle DATE 字段為 NULL 報「無效的列類型」:java.util.Date vs java.sql.Date 類型不匹配

     編輯:程式設計綜合問答

錯誤堆疊

java.sql.SQLException: 無效的列類型
at oracle.jdbc.driver.OraclePreparedStatement.setNull(...)
at oracle.jdbc.driver.OraclePreparedStatement.setObject(...)

根因

實體類字段為 java.util.Date,直接調用 ps.setDate(index, date) 或 ps.setObject(index, date)。Oracle 驅動要求 setDate 參數必須是 java.sql.Date(或 java.sql.Timestamp),java.util.Date 會觸發類型檢查失敗。

修正代碼

// 工具方法:安全轉換
public static java.sql.Date toSqlDate(java.util.Date utilDate) {
    return utilDate == null ? null : new java.sql.Date(utilDate.getTime());
}

// 使用示例
ps.setDate(index++, toSqlDate(account.getPauseDate()));
ps.setDate(index++, toSqlDate(account.getCloseDate()));
ps.setDate(index++, toSqlDate(account.getBirthdate()));
ps.setDate(index++, toSqlDate(account.getLastLoginTime()));

完整參數綁定模板

int idx = 1;
ps.setObject(idx++, account.getRecommenderId());      // Integer
ps.setString(idx++, account.getLoginName());          // String
ps.setString(idx++, account.getLoginPassword());
ps.setDate(idx++, toSqlDate(account.getPauseDate())); // DATE
ps.setDate(idx++, toSqlDate(account.getCloseDate()));
ps.setString(idx++, account.getRealName());
// ... 其他字段
ps.setDate(idx++, toSqlDate(account.getLastLoginTime()));
ps.setString(idx++, account.getLastLoginIp());
ps.executeUpdate();

進階:統一處理 NULL 與類型轉換

封裝 ParameterBinder 工具類,根據字段類型自動調用 setNull、setString、setDate、setTimestamp,消除手動索引錯誤:

binder.bind(ps, 1, account.getPauseDate()); // 內部自動 toSqlDate + setDate/null

驅動配置提示

JDBC URL 建議使用標準格式:

jdbc:oracle:thin:@//localhost:1521/orcl  // 服務名模式
// 或
jdbc:oracle:thin:@localhost:1521:orcl    // SID 模式

兩種均可,服務名模式支援 RAC 故障轉移。

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