2012-04-24 12 views
5

जब मैं निम्नलिखित सर्वलेट चलाएँ:ResultSet.getString (1) फेंकता java.sql.SQLException: वर्तमान कर्सर स्थिति पर अमान्य कार्रवाई

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

मैं निम्नलिखित अपवादों मिलती है:

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 

सर्वर से ऊपर लॉग दिखाता है कि पंक्ति संख्या 28 अपवाद का कारण है। लेकिन मैं अपवाद का कारण नहीं ढूंढ पा रहा हूं। तालिका के सभी स्तंभों में वर्कर का डेटाटाइप है।

मैंने सर्वलेट कोड में लाइन संख्या 28 (सर्वर लॉग के अनुसार अपवाद का कारण) हाइलाइट किया है।

+0

सर्वर लॉग –

उत्तर

28

आपको पहले next कथन का उपयोग करना चाहिए।

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

अद्यतन

के रूप में जावा 6 प्रलेखन कहते हैं

एक ResultSet कर्सर आरंभ में पहली पंक्ति से पहले रखा जाता है; विधि के लिए पहली कॉल अगली पंक्ति को पहली पंक्ति बनाता है; दूसरी कॉल दूसरी पंक्ति को वर्तमान पंक्ति बनाता है, और इसी तरह।

इसका मतलब यह है कि जब आप सजा पर अमल

ResultSet set = statement.executeQuery(); 

ResultSet set बनाया जाएगा और डेटा की पहली परिणाम से पहले एक पंक्ति की ओर इशारा करते। registrationinformation

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

से

चयन ईमेल, firstname तो, अपने ResulSet openning के बाद, आप विधि next पहली पंक्ति में ले जाना आसान पर अमल: आप इसे इस तरह से देख सकते हैं।

if(set.next()) 

अब set ऐसा दिखता है।

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

आप ResultSet में सभी डेटा पढ़ने की जरूरत है, तो आप थोड़ी देर के बजाय का उपयोग करना चाहिए की अगर:

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

set.next() वापसी झूठी, इसका मतलब है पढ़ने के लिए कोई पंक्ति नहीं थी तो , तो आपका समय लूप खत्म हो जाएगा।

अधिक जानकारी here

+0

'set.next में अपवाद पर प्रकाश डाला()' आगे कर्सर 1 पंक्ति ले जाता है। मैं किसी विशेष सेल से डेटा निकालने के लिए क्वेरी निष्पादित करने के बाद सेट में मौजूद डेटा देखना चाहता हूं। मैं उसको कैसे करू ? –

+0

हालांकि यह काम करता है, कृपया बताएं कि 'set.next() 'क्या करता है? मुझे डॉक्टर से समझ में नहीं आया। 'Set.next()' से पहले कर्सर कहाँ स्थित था? –

+0

क्वेरी के निष्पादन के बाद जो दूसरी पंक्ति से संबंधित व्यक्ति का नाम और ईमेल प्राप्त करने के लिए कहता है, अब सेट की स्थिति क्या होगी? क्या यह अभी भी _0th_ पंक्ति होगी? –

1

आप सही स्थिति में सूचक सेट करने के लिए:

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

'set.next()' कर्सर को 1 पंक्ति आगे ले जाता है। मैं किसी विशेष सेल से डेटा निकालने के लिए क्वेरी निष्पादित करने के बाद सेट में मौजूद डेटा देखना चाहता हूं। मैं यह कैसे कर सकता हूं? –

0

ResultSet सेट = statement.executeQuery();

सेट को दोहराएं और फिर स्ट्रिंग प्राप्त करें।

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

} 
+0

'set.next()' कर्सर को 1 पंक्ति आगे ले जाता है। मैं किसी विशेष सेल से डेटा निकालने के लिए क्वेरी निष्पादित करने के बाद सेट में मौजूद डेटा देखना चाहता हूं। मैं उसको कैसे करू ? –

0

परिणाम आरंभ करने के बाद जांच करें कि क्या कर्सर इसमें पंक्ति है या नहीं।

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

संबंधित मुद्दे