2012-04-24 12 views
5

Quando eseguo il seguente servlet:ResultSet.getString (1) getta java.sql.SQLException: Operazione non valida alla posizione corrente del cursore

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

ottengo le seguenti eccezioni:

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 

I i registri precedenti dal server mostrano che la riga numero 28 è la causa dell'eccezione. Ma non sono in grado di ottenere il motivo dell'eccezione. Tutte le colonne nella tabella hanno un tipo di dati di varchar.

Ho evidenziato il numero di riga 28 (causa di eccezione in base ai registri del server) nel codice servlet.

+0

evidenziato l'eccezione nel registro del server –

risposta

28

È necessario utilizzare prima l'istruzione next.

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

UPDATE

Come Java 6 documentazione dice

Un ResultSet cursore è inizialmente posizionato prima della prima riga; la prima chiamata al metodo successivo rende la prima riga la riga corrente; la seconda chiamata rende la seconda riga la riga corrente e così via.

Questo significa che quando si esegue la sentenza

ResultSet set = statement.executeQuery(); 

il gruppo di risultati verrà creato set e che punta a una fila prima che il primo risultato dei dati. Si può guardare in questo modo:

selezionare E-mail, Nome FROM registrationinformation

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

Così, dopo openning vostro ResulSet, si esegue il metodo next per spostarlo nella prima riga.

if(set.next()) 

Ora set è come questo.

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

Se avete bisogno di leggere tutti i dati nel ResultSet, si dovrebbe usare un po ', invece di se:

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

Se il set.next() ritorno falso, vuol dire che non vi era alcuna riga da leggere , così il tuo ciclo temporale finirà.

Ulteriori informazioni here.

+0

'set.next()' sposta il cursore fila 1 in avanti. Voglio vedere i dati che ci sono nel set dopo che ho eseguito la query per estrarre i dati da una cella particolare. Come lo faccio ? –

+0

Anche se funziona, puoi spiegare cosa fa 'set.next()'? Non ho capito dal Doc. Prima di 'set.next()' dov'era posizionato il cursore? –

+0

Dopo l'esecuzione della query che chiede di ottenere il nome e l'e-mail della persona appartenente alla seconda riga, quale sarà la posizione del set ora? Sarà ancora la _a riga? –

1

è necessario impostare il puntatore alla posizione corretta:

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

'set.next()' sposta il cursore di 1 riga in avanti. Voglio vedere i dati che ci sono nel set dopo che ho eseguito la query per estrarre i dati da una cella particolare. Come faccio? –

0

ResultSet set = Statement.executeQuery();

Iterare il set e ottenere String.

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

} 
+0

'set.next()' sposta il cursore di 1 riga in avanti. Voglio vedere i dati che ci sono nel set dopo che ho eseguito la query per estrarre i dati da una cella particolare. Come lo faccio ? –

0

dopo l'inizializzazione di ResultSet controllare se il cursore contiene o meno una riga.

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