2012-04-24 130 views
5

Cuando ejecuto el siguiente servlet:ResultSet.getString (1) lanza java.sql.SQLException: Operación no válida en la posición actual del cursor

// 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); 
    } 

consigo 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 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 marcado el número de línea 28 (causa de excepción según los registros del servidor) en el código de servlet.

+0

destacó la excepción en el registro del servidor –

Respuesta

28

Primero debe usar la instrucción next.

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

ACTUALIZACIÓN

A medida que la documentación de Java 6 dice

cursor

A ResultSet se posiciona 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 se ejecuta la sentencia

ResultSet set = statement.executeQuery(); 

el conjunto de resultados set se creará y que apunta a una fila antes de que el primer resultado de los datos. Usted puede mirar de esta manera:

correo electrónico SELECT Nombre FROM registrationinformation

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

Así que, después de su openning ResulSet, se ejecuta el método next para moverlo a la primera fila.

if(set.next()) 

ahora set se parece a esto.

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

Si necesita leer todos los datos del conjunto de resultados, se debe utilizar un tiempo en lugar de si:

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

Si la devolución set.next() falsa, quiere decir que no había fila para leer , entonces tu ciclo while terminará.

Más información here.

+0

'set.next()' mueve la fila del cursor 1 hacia adelante. Quiero ver los datos que están allí en el conjunto después de haber ejecutado la consulta para extraer los datos de una celda en particular. Cómo puedo hacer eso ? –

+0

Aunque funciona, ¿puedes explicar qué hace 'set.next()'? No entendí por el Doc. Antes de 'set.next()' ¿dónde estaba el cursor? –

+0

Después de la ejecución de la consulta que solicita obtener el nombre y el correo electrónico de la persona que pertenece a la segunda fila, ¿cuál será la posición de establecer ahora? ¿Seguirá siendo la _0ª fila? –

1

usted tiene que fijar el puntero a la posición correcta:

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

'set.next()' mueve el cursor 1 fila hacia adelante. Quiero ver la información que está allí en el conjunto después de haber ejecutado la consulta para extraer los datos de una celda en particular. ¿Cómo hago eso? –

0

conjunto conjunto de resultados = Statement.executeQuery();

Iterar el conjunto y luego obtener Cadena.

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

} 
+0

'set.next()' mueve el cursor 1 fila hacia adelante. Quiero ver los datos que están allí en el conjunto después de haber ejecutado la consulta para extraer los datos de una celda en particular. Cómo puedo hacer eso ? –

0

después de la inicialización ResultSet compruebe si el cursor tiene una fila o no, p. Ej.

if(rs.next()){ //your all other works should go here }

Cuestiones relacionadas