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

SQL 分頁查詢:PreparedStatement 動態 LIMIT 參數導致首次執行報錯

     編輯:程式設計綜合問答

現象描述

同一方法 allSel() 根據頁碼動態組裝兩種 SQL:

  • 非尾頁:LIMIT ?, 6(兩個參數)
  • 尾頁:LIMIT ?, ?(兩個參數,第二個由 page.getLastPageNum() 提供)

結果:**每次第一次執行非尾頁 SQL 都報錯,之後重試卻正常**。

根因分析

  1. 參數索引錯誤:LIMIT ?, 6 只有一個佔位符 ?,但程式可能嘗試設定兩個參數(如 ps.setInt(1, ...); ps.setInt(2, 6)),導致 Parameter index out of range。
  2. 連線/語句快取:部分連線池或驅動會快取 PreparedStatement,首次建立時參數元資料不匹配,重試時複用已修正的快取而成功。
  3. SQL 語法:MySQL LIMIT offset, row_count 需兩個數值,若寫成 LIMIT ?, 6 需確保只設一個參數(offset),6 直接寫死或用 LIMIT ?, ? 統一處理。

修正建議

// 統一使用兩個參數,避免邏輯分支
String sql = "SELECT * FROM item WHERE ite_title LIKE ? OR ite_descr LIKE ? OR ite_type LIKE ? LIMIT ?, ?";
ps = conn.prepareStatement(sql);
ps.setString(1, "%" + keyword + "%");
ps.setString(2, "%" + keyword + "%");
ps.setString(3, "%" + keyword + "%");
ps.setInt(4, offset);           // 起始筆數
ps.setInt(5, pageSize);         // 每頁筆數,尾頁時傳入 page.getLastPageNum()

除錯技巧

  • 印出 ps.toString() 或開啟驅動日誌 (log4jdbc) 觀察實際 SQL 與參數。
  • 捕捉 SQLException 並印出 getErrorCode()、getSQLState() 定位問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved