ResultSet.getString(1) 抛出 java.sql.SQLException: Invalid operation at current cursor position [英] ResultSet.getString(1) throws java.sql.SQLException: Invalid operation at current cursor position

查看:21
本文介绍了ResultSet.getString(1) 抛出 java.sql.SQLException: Invalid operation at current cursor position的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我运行以下 servlet 时:

When I run the following 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);
    }

我收到以下异常:

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 行是异常的原因.但我无法得到例外的原因.表中所有列的数据类型均为 varchar.

The logs above from the server show that line number 28 is the cause of the exception. But i am unable to get the reason for exception. All the columns in the table have a datatype of varchar.

我在 servlet 代码中突出显示了第 28 行 (根据服务器日志的异常原因).

I have highlighted line number 28 (cause of exception according to server logs) in the servlet code.

推荐答案

你应该先使用 next 语句.

You should use the next statement first.

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

更新

正如 Java 6 文档所说

As the Java 6 Documentation says

ResultSet 游标最初定位在第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推.

A ResultSet cursor is initially positioned before the first row; the first call to the method next makes the first row the current row; the second call makes the second row the current row, and so on.

这意味着当你执行这句话时

This means when you execute the sentence

ResultSet set = statement.executeQuery();

ResultSet set 将被创建并指向数据的第一个结果之前的一行.你可以这样看:

The ResultSet set will be created and pointing to a row before the first result of the data. You can look it this way:

SELECT email,firstname FROM registrationinformation

SELECT email,firstname FROM registrationinformation

    email              | firstname
    ____________________________________
0                                        <= set points to here
1   email1@gmail.com   | Email1 Person
2   foo@bar.com        | Foo Bar

因此,在打开您的 ResulSet 后,您执行方法 next 将其移动到第一行.

So, after openning your ResulSet, you execute the method next to move it to the first row.

if(set.next()) 

现在 set 看起来像这样.

Now set looks like this.

    email              | firstname
    ____________________________________
0
1   email1@gmail.com   | Email1 Person   <= set points to here
2   foo@bar.com        | Foo Bar

如果需要读取ResultSet中的所有数据,应该使用while而不是if:

If you need to read all the data in the ResultSet, you should use a while instead of if:

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

如果 set.next() 返回 false,则表示没有要读取的行,因此您的 while 循环将结束.

If the set.next() return false, it means that there was no row to read, so your while loop will end.

更多信息此处.

这篇关于ResultSet.getString(1) 抛出 java.sql.SQLException: Invalid operation at current cursor position的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆