Jeu de résultats.getString(1) throws java.sql.SQLException: opération non Valide à la position actuelle du curseur
Quand je lance la suite de 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);
}
- Je obtenir les exceptions suivantes:
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
Les journaux ci-dessus à partir du serveur montrent que le numéro de la ligne 28 est la cause de l'exception. Mais je n'arrive pas à obtenir la raison de l'exception. Toutes les colonnes dans la table ont un type de données varchar.
J'ai mis en évidence le numéro de ligne 28 (cause de l'exception selon les journaux de serveur) dans le code de la servlet.
- mis en évidence l'exception dans le journal du serveur
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser le
next
déclaration de la première.Mise à JOUR
Le Java 6 Documentation dit
Cela signifie que lorsque vous exécutez la phrase
Le jeu de résultats
set
sera créé et pointant vers une ligne avant la première suite de données. Vous pouvez le regarder de cette façon:SÉLECTIONNEZ e-mail,prénom DE registrationinformation
Donc, après l'ouverture de votre ResulSet, vous exécutez la méthode
next
pour le déplacer vers la première ligne.Maintenant
set
ressemble à ceci.Si vous avez besoin de lire toutes les données dans le jeu de résultats, vous devez utiliser un certain temps au lieu de s':
Si le
set.next()
return false, cela signifie qu'il n'y a pas de ligne à lire, de sorte que votre boucle while se termine.Plus d'informations ici.
set.next()
déplace le curseur à 1 rangée de l'avant. Je veux voir les données qui y dans le jeu après que j'ai exécuté la requête pour extraire les données à partir d'une cellule donnée. Comment dois-je faire ?set.next()
faire ? Je n'ai pas compris de la Doc. Avantset.next()
où se trouvait le curseur positionné ?ResultSet
, cela signifieResultSet set = statement.executeQuery();
, la position sera 0e ligneset.executeQuery("the same query as mentioned")
Après cela, lorsque je neif(set.next()) { set.getString("firstName")}
- je obtenir le nom de la personne. Ce nom peut être le nom de famille dans la tableResultSet set = déclaration.executeQuery();
Itérer le jeu, puis obtenir de la Chaîne.
set.next()
déplace le curseur à 1 rangée de l'avant. Je veux voir les données qui y dans le jeu après que j'ai exécuté la requête pour extraire les données à partir d'une cellule donnée. Comment dois-je faire ?Vous devez placer le pointeur à la position correcte:
set.next()
déplace le curseur à 1 rangée de l'avant. Je veux voir les données qui y dans le jeu après que j'ai exécuté la requête pour extraire les données à partir d'une cellule donnée.Comment dois-je faire ?après l'initialisation de l'objet ResultSet vérifier si le curseur a la ligne ou pas par exemple
if(rs.next()){
//your all other works should go here
}
Vous pouvez obtenir le premier avec:
rs.first()