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

Access「可選功能未實現」錯誤:通常是資料型別衝突

     編輯:程式設計疑難解答

錯誤訊息

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 可選的功能未實現

常見成因與解決

  1. 資料型別不匹配/衝突(最常見)
    Java 端 PreparedStatement.setXxx() 型別與 Access 資料表欄位型別不符。例如:
    - Access 欄位為 Number (Long Integer),Java 傳 setString()
    - Access 欄位為 Date/Time,Java 傳 setString("2024-01-01") 而非 setDate()
    - Access AutoNumber 欄位嘗試手動插入值
    對策:核對每欄位型別,使用對應 setInt/setLong/setDate/setTimestamp,AutoNumber 欄位略過不傳值。
  2. SQL 語法使用 Access 不支援的功能
    - OUTER JOIN 語法舊版驅動不支援
    - 子查詢、CASE WHEN、LIMIT 等
    對策:簡化 SQL,改用多條語句或在 Java 端處理邏輯。
  3. ODBC 驅動版本過舊
    JDBC-ODBC Bridge + 舊版 Access 驅動(Microsoft Access Driver (*.mdb))功能受限。
    對策:升級至 UCanAccess 純 Java 驅動(支援 .accdb/.mdb、功能完整、無需 ODBC 設定)。
  4. 欄位名為保留字未加括號
    INSERT INTO Table (Date, Key) VALUES (?, ?) → INSERT INTO Table ([Date], [Key]) VALUES (?, ?)

快速排查清單

  • [ ] 每個 setXxx 索引與型別對應正確?
  • [ ] AutoNumber/Identity 欄位是否排除在 INSERT 清單外?
  • [ ] SQL 是否含 Access 不支援語法?
  • [ ] 欄位名是否含空格/保留字?已加 []?
  • [ ] 嘗試換用 UCanAccess 驅動?

遷移建議:棄用 JDBC-ODBC Bridge

Java 8 起移除 JDBC-ODBC Bridge。諷刺的是,這個錯誤常出現在仍用 Bridge 的舊專案。立即遷移至 UCanAccess:

<dependency>
    <groupId>net.sf.ucanaccess</groupId>
    <artifactId>ucanaccess</artifactId>
    <version>5.0.1</version>
</dependency>

連線字串:jdbc:ucanaccess://C:/path/db.accdb。無需 ODBC DSN、支援完整 SQL-92、效能更佳。

總結

「可選功能未實現」多半是型別不匹配或驅動限制。核對型別、修正 SQL、升級驅動三步走,通常能徹底解決。

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