java.sql.SQLException : Invalid operation for forward only resultset : isLast

标签 java connection resultset sqlexception

最初我给出了:

 Statement replystmt = connection.createStatement;

我改成

Statement replystmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

ResultSet replyMessage = replystmt.executeQuery("SELECT * from REPLYMAIL where PARENTMESSAGEID = '" + parentMessage.getString("MESSAGEID") + "'");

我仍然收到以下错误:

        java.sql.SQLException: Invalid operation for forward only resultset : isLast
            at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
            at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
            at oracle.jdbc.driver.OracleResultSetImpl.isLast(OracleResultSetImpl.java:390)
            at inbox.InboxReader.getImportance(InboxReader.java:249)
            at inbox.InboxReader.main(InboxReader.java:39)

编辑:

static long getImportance(String username) throws Exception
    {
        Connection connection = connectToDatabase();
        Statement parentstmt = connection.createStatement();
        ResultSet parentMessage = parentstmt.executeQuery("SELECT * from MAIL");
        long time1 = 0, sign = 0;

        while(parentMessage.next())
        {
            System.out.println("Parent message : " + parentMessage.getString("MESSAGEID"));
            int c = 0, evenc = 0;
            String j = "";

            Statement replystmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            //stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)

            ResultSet replyMessage = replystmt.executeQuery("SELECT * from REPLYMAIL where PARENTMESSAGEID = '" + parentMessage.getString("MESSAGEID") + "'");

            if(!(parentMessage.getString("SENDERNAME").contains(username)))   // When user receives a message first
            {
                while(replyMessage.next())
                {
                    if(c==0)   // for calculating the time between his reply time - message received time  
                    {
                        time1 = replyMessage.getTimestamp("SENDDATE").getTime() - parentMessage.getTimestamp("RECEIVEDATE").getTime();
                        System.out.println("IF time in if c=0, " + time1);
                        c++;
                        sign = 1; 
                    }
                    else   
                    {

                        evenc++; 
                        if(sign == 1) {
                            sign = -1;
                            j = "RECEIVEDATE";
                            System.out.println("IF receivedate : " + replyMessage.getTimestamp(j).getTime());
                        }
                        else if(sign != 1) {
                            sign = 1;
                            j = "SENDDATE";
                            System.out.println("IF senddate : " + replyMessage.getTimestamp(j).getTime());
                        }   

                        if(replyMessage.isLast() && (evenc%2)!=0) {
                            System.out.println("IF skip");
                        }
                        else {
                            time1 = time1 + (sign * replyMessage.getTimestamp(j).getTime());
                        }
                        System.out.println("IF time in if c>0 , "+time1);
                    }
                }
            }
            else {             // When user sends a message first
                sign = -1;
                while(replyMessage.next()) {
                    evenc++;
                    if(sign == 1) {
                        sign = -1;
                        j = "RECEIVEDATE";
                        System.out.println("ELSE receivedate : " + replyMessage.getTimestamp(j).getTime());
                    }
                    else {
                        sign = 1;
                        j = "SENDDATE";
                        System.out.println("ELSE senddate : " + replyMessage.getTimestamp(j).getTime());
                    }   

                    if(replyMessage.isLast() && (evenc%2)!=0) {
                        System.out.println("ELSE skip");
                    }
                    else {
                        time1 = time1 + (sign * replyMessage.getTimestamp(j).getTime());
                    }
                    System.out.println("ELSE time in if c>0 , "+time1);
                }
            }   
        }
        connection.close();
        return time1;
    }

如何解决这个问题?

谢谢!

最佳答案

这个link表示 Oracle 可能不支持 isLast() 方法来读取存储过程 ResultSet。 作为解决方法,您可以计算首先返回的行数。然后,当您在处理过程中实际循环遍历所有行时,就知道哪一行是最后一行。

关于java.sql.SQLException : Invalid operation for forward only resultset : isLast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8032214/

相关文章:

php - PHP 应用程序中的 MySQL 连接监视器

java - 结果集.getObject(1); Actor 阵容发生在哪里?

java - 为什么 ResultSet 在使用字符串作为值的查询中少了一个字符?

java - 如何使一些 Action 依赖于另一个 Action 的完成?

java - 如何在eclipse中使用和导入eSpeak?

java - 星号矩形问题 Java MOOC 39.3

java - 如何使用Where子句查询显示从jtextfield到jtable的搜索查询从mysql表

java - 有没有办法将字符添加到堆栈?

javascript - Cordova 连接中 Uncaught ReferenceError

ios - 如何最好地处理 iOS 应用程序中没有互联网连接的问题