read query one from for ejemplo java jdbc resultset sqlexception

query - resultset size java



ResultSet.getString(1) throws java.sql.SQLException: operación no válida en la posición actual del cursor (3)

Cuando ejecuto el siguiente servlet:

// package projectcodes; public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { String UserID = request.getParameter("UserID"); String UserPassword = request.getParameter("UserPassword"); String userName = null; String Email = null; Encrypter encrypter = new Encrypter(); String hashedPassword = null; try { hashedPassword = encrypter.hashPassword(UserPassword); Context context = new InitialContext(); DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/photog"); Connection connection = ds.getConnection(); String sqlStatement = "SELECT email,firstname FROM registrationinformation WHERE password=''" + hashedPassword + "''"; PreparedStatement statement = connection.prepareStatement(sqlStatement); ResultSet set = statement.executeQuery(); userName = set.getString(1); // <<---------- Line number 28 response.sendRedirect("portfolio_one.jsp"); // userName = set.getString("FirstName"); Email = set.getString(3); if(set.wasNull() || Email.compareTo(UserID) != 0) { // turn to the error page response.sendRedirect("LoginFailure.jsp"); } else { // start the session and take to his homepage HttpSession session = request.getSession(); session.setAttribute("UserName", userName); session.setMaxInactiveInterval(900); // If the request doesn''t come withing 900 seconds the server will invalidate the session RequestDispatcher rd = request.getRequestDispatcher("portfolio_one.jsp"); rd.forward(request, response); // forward to the user home-page } }catch(Exception exc) { System.out.println(exc); }

Obtengo las siguientes excepciones:

INFO: java.sql.SQLException: Invalid operation at current cursor position. at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source) at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) at org.apache.derby.client.am.ResultSet.getString(Unknown Source) at com.sun.gjc.spi.base.ResultSetWrapper.getString(ResultSetWrapper.java:155) -----> at projectcodes.ValidateDataForSignIn.doPost(ValidateDataForSignIn.java:28 at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722) Caused by: org.apache.derby.client.am.SqlException: Invalid operation at current cursor position. at org.apache.derby.client.am.ResultSet.checkForValidCursorPosition(Unknown Source) at org.apache.derby.client.am.ResultSet.checkGetterPreconditions(Unknown Source) ... 30 more

Los registros anteriores del servidor muestran que el número de línea 28 es la causa de la excepción. Pero no puedo obtener el motivo de la excepción. Todas las columnas en la tabla tienen un tipo de datos de varchar.

He resaltado el número de línea 28 (causa de la excepción de acuerdo con los registros del servidor) en el código del servlet.


Deberías usar la next declaración primero.

ResultSet set = statement.executeQuery(); if (set.next()) { userName = set.getString(1); //your logic... }

ACTUALIZAR

Como dice la Documentación Java 6

Un cursor ResultSet se coloca inicialmente antes de la primera fila; la primera llamada al método siguiente convierte a la primera fila en la fila actual; la segunda llamada hace que la segunda fila sea la fila actual, y así sucesivamente.

Esto significa que cuando ejecutas la oración

ResultSet set = statement.executeQuery();

El set ResultSet se creará y señalará una fila antes del primer resultado de los datos. Puedes verlo de esta manera:

SELECCIONAR correo electrónico, nombre FROM información de registro

email | firstname ____________________________________ 0 <= set points to here 1 [email protected] | Email1 Person 2 [email protected] | Foo Bar

Entonces, después de abrir su ResulSet, usted ejecuta el método al next para moverlo a la primera fila.

if(set.next())

Ahora el set ve así.

email | firstname ____________________________________ 0 1 [email protected] | Email1 Person <= set points to here 2 [email protected] | Foo Bar

Si necesita leer todos los datos en el ResultSet, debe usar un tiempo en lugar de si:

while(set.next()) { //read data from the actual row //automatically will try to forward 1 row }

Si set.next() devuelve false, significa que no había ninguna fila para leer, por lo que su ciclo while finalizará.

Más información aquí .


ResultSet set = statement.executeQuery ();

Itera el conjunto y luego obtiene String.

while(set.next()) { me = set.getString(1); // <<---------- Line number 28 }


Tienes que configurar el puntero a la posición correcta:

while(set.hasNext()){ set.next(); String a = set.getString(1); String b = set.getString(2); }