org.hsqldb.HsqlException: неправильное состояние курсора (JSP/Access)
Я пытаюсь увидеть пример этой страницы ( Pagination with JSP) с базой данных доступа, но я получаю следующую ошибку:
org.hsqldb.HsqlException: неправильное состояние курсора: указанный курсор не расположен в строке для оператора UPDATE, DELETE, SET или GET:; Текущая позиция результата запроса перед первой записью
Мой код такой:
Фруктовый класс
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Daniel
*/
public class Fruta {
private String fruta, color, sabor;
public Fruta() throws ClassNotFoundException, SQLException{
fruta = "";
color = "";
sabor = "";
}
/**
* @return the fruta
*/
public String getFruta() {
return fruta;
}
/**
* @param fruta the fruta to set
*/
public void setFruta(String fruta) {
this.fruta = fruta;
}
/**
* @return the color
*/
public String getColor() {
return color;
}
/**
* @param color the color to set
*/
public void setColor(String color) {
this.color = color;
}
/**
* @return the sabor
*/
public String getSabor() {
return sabor;
}
/**
* @param sabor the sabor to set
*/
public void setSabor(String sabor) {
this.sabor = sabor;
}
}
FruitDAO
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Daniel
*/
public class FrutaDAO {
Connection connection;
Statement stmt;
private int noRecords;
public FrutaDAO(){}
private static Connection getConnection()
throws SQLException,
ClassNotFoundException
{
Connection con = Conexion.getConnection();
return con;
}
public List<Fruta> verFrutas(
int offset,
int noOfRecords)
{
String query = "SELECT * FROM Frutas LIMIT "
+ offset + ", " + noOfRecords;
List<Fruta> list = new ArrayList<Fruta>();
Fruta fruta = null;
try {
connection = getConnection();
stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
if(rs.next()){
while (rs.next()) {
fruta = new Fruta();
fruta.setFruta(rs.getString("Fruta"));
fruta.setFruta(rs.getString("Color"));
fruta.setFruta(rs.getString("Sabor"));
list.add(fruta);
}
}
rs.close();
rs = stmt.executeQuery("SELECT COUNT(*) FROM Frutas");
if(rs.next())
this.noRecords = rs.getInt(1);
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally
{
try {
if(stmt != null)
stmt.close();
if(connection != null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
public int getNoOfRecords() {
return noRecords;
}
}
FruitServlet
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Daniel
*/
@WebServlet(name = "FrutaServlet", urlPatterns = {"/FrutaServlet"})
public class FrutaServlet extends HttpServlet {
public FrutaServlet() {super();}
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
int page = 1;
int recordsPerPage = 5;
if(request.getParameter("page") != null)
page = Integer.parseInt(request.getParameter("page"));
FrutaDAO dao = new FrutaDAO();
List<Fruta> list = dao.verFrutas((page-1)*recordsPerPage,
recordsPerPage);
int noOfRecords = dao.getNoOfRecords();
int noOfPages = (int) Math.ceil(noOfRecords * 1.0 / recordsPerPage);
request.setAttribute("listaFruta", list);
request.setAttribute("noOfPages", noOfPages);
request.setAttribute("currentPage", page);
RequestDispatcher view = request.getRequestDispatcher("index.jsp");
view.forward(request, response);
}
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet FrutaServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet FrutaServlet at " + request.getContextPath() + "</h1>");
out.println("</body>");
out.println("</html>");
}
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
Я уже использую rs.next (), что здесь произошло?
1 ответ
Я не уверен, может ли это решить это или нет, но вы не должны использовать if(rs.next())
а также while(rs.next())
для того же запроса попробуйте изменить свой код FruitDAO, как показано ниже:
//if(rs.next()){ //remove this check
while (rs.next()) {
fruta = new Fruta();
fruta.setFruta(rs.getString("Fruta"));
fruta.setFruta(rs.getString("Color"));
fruta.setFruta(rs.getString("Sabor"));
list.add(fruta);
}
//}
rs.close();