简体   繁体   English

“ java.sql.SQLException:结果集结束后”错误

[英]“java.sql.SQLException: After end of result set” error

Following is the code having error : 以下是有错误的代码:

java.sql.SQLException: After end of result set java.sql.SQLException:结果集结束后

Please help. 请帮忙。

import java.sql.*;
import java.util.ArrayList;

public class ExtractCallInfo1 {
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost?autoReconnect=true&useSSL=false";  
static final String USER = "root";
static final String PASS = "root";
public static boolean checkDBExists(String dbName){

    try{
        Class.forName(JDBC_DRIVER); //Register JDBC Driver

        //System.out.println("Creating a connection...");
        Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); //Open a connection

        ResultSet resultSet = conn.getMetaData().getCatalogs();

        while (resultSet.next()) {

          String databaseName = resultSet.getString(1);
            if(databaseName.equals(dbName)){
                return true;
            }
        }
        resultSet.close();

    }
    catch(Exception e){
        e.printStackTrace();
    }

    return false;
}

public static boolean checkTABLEExists(String DB_NAME, String TABLE_NAME){
    try{
        Class.forName(JDBC_DRIVER);
        if(!checkDBExists(DB_NAME)){
            System.out.println("Database "+DB_NAME+" doesn't exist");
            return false;
        }
        System.out.println("Creating a connection...");
        Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
        Statement stmt = conn.createStatement();
        String sql = "USE "+DB_NAME;
        stmt.executeUpdate(sql);
        DatabaseMetaData dbm = conn.getMetaData();
        ResultSet tables = dbm.getTables(null, null,TABLE_NAME, null);
        if (tables.next()) {
            return true;
        }
        else {
            return false;
        }

    }
    catch(Exception e){
        e.printStackTrace();
    }
    return false;
}
public static void main(String[] args){
    try{
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
        Statement stmt = conn.createStatement();
        String DB_NAME = "SIP";
        String PACKET_TABLE_NAME = "PACKETDATABASE";
        String USERS_TABLE_NAME = "USERS";
        String COMPLETE_TABLE_NAME = "COMPLETECALLS";
        String INCOMPLETE_TABLE_NAME = "INCOMPLETECALLS";
        String CALLERAVERAGE_TABLE_NAME = "CALLERAVERAGE";
        String CALLERFREQUENCY_TABLE_NAME = "CALLERFREQUENCY";
        String CALLERCALLEEAVERAGE_TABLE_NAME = "CALLERCALLEEAVERAGE";
        String CALLERCALLEEFREQUENCY_TABLE_NAME = "CALLERCALLEEFREQUENCY";
        String CALLERTOTALDURATION_TABLE_NAME = "CALLERTOTALDURATION";
        String CALLERBETA_TABLE_NAME = "CALLERBETA";
        String CALLERINCOMPLETEFREQUENCY_TABLE_NAME = "CALLERINCOMPLETEFREQUENCY";
        String CALLERGAMMA_TABLE_NAME = "CALLERGAMMA";
        String CALLERALPHA_TABLE_NAME = "CALLERALPHA";
        String CALLEEFREQUENCY_TABLE_NAME = "CALLEEFREQUENCY";
        String CALLERRHO_TABLE_NAME = "CALLERRHO";
        String CALLERAVERAGECLASSIFICATION_TABLE_NAME = "CALLERAVERAGECLASSIFICATION";

        if(!checkDBExists(DB_NAME)){
            System.out.println("Database "+DB_NAME+" doesn't exist");
            return ;
        }

        String sql = "USE " +DB_NAME;
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+USERS_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+USERS_TABLE_NAME+" "+
                "SELECT CallerName AS User from "+PACKET_TABLE_NAME+" "+
                "UNION "+
                "SELECT CalleeName AS User from "+PACKET_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+COMPLETE_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+COMPLETE_TABLE_NAME+" "+
                "(CallId VARCHAR(255) NOT NULL PRIMARY KEY," +
                "CallerName VARCHAR(255) NOT NULL," + 
                "CallerIp VARCHAR(255) NOT NULL," + 
                "CalleeName VARCHAR(255) NOT NULL," + 
                "CalleeIp VARCHAR(255) NOT NULL," +
                "CallDuration DOUBLE NOT NULL)";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+INCOMPLETE_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+INCOMPLETE_TABLE_NAME+" "+
                "(CallId VARCHAR(255) NOT NULL PRIMARY KEY," +
                "CallerName VARCHAR(255) NOT NULL," + 
                "CallerIp VARCHAR(255) NOT NULL," + 
                "CalleeName VARCHAR(255) NOT NULL," + 
                "CalleeIp VARCHAR(255) NOT NULL," +
                "CallDuration DOUBLE)";
        stmt.executeUpdate(sql);

        sql = "SELECT DISTINCT CallId from "+ PACKET_TABLE_NAME;
        ArrayList<String> uniqueCallIds = new ArrayList<String>();
        ResultSet result = stmt.executeQuery(sql);
        while(result.next()){
            uniqueCallIds.add(result.getString("CallId"));
        }
        for(int i = 0;i < uniqueCallIds.size();i++){
            String cur_id = uniqueCallIds.get(i);
            sql = "SELECT * from "+PACKET_TABLE_NAME+" "+
            "where Method = 'INVITE' and CallId = '"+cur_id+"'";
            Statement stmt1 = conn.createStatement();
            Statement stmt2 = conn.createStatement();
            ResultSet result_one = stmt1.executeQuery(sql);
            sql = "SELECT * from "+PACKET_TABLE_NAME+" "+
            "where Method = 'BYE' and CallId = '"+cur_id+"'";
            ResultSet result_two = stmt2.executeQuery(sql);
            if(!result_two.next()){
                result_one.next();
                sql = "INSERT INTO "+INCOMPLETE_TABLE_NAME+
                        " values('"+result_one.getString("CallId")+"','"+
                        result_one.getString("CallerName")+"','"+
                        result_one.getString("CallerIp")+"','"+
                        result_one.getString("CalleeName")+"','"+
                        result_one.getString("CalleeIp")+"',"+
                        "NULL"+")";
                stmt.executeUpdate(sql);
            }
            else{
                long call_start = Long.MAX_VALUE;
                while(result_one.next()){
                    String time = result_one.getString("TimeOfArrival");
                    long cur = Long.parseLong(time);
                    if(cur < call_start){
                        call_start = cur;
                    }
                }
                result_two.next();
                long call_end = Long.parseLong(result_two.getString("TimeOfArrival"));
                long dura = (call_end - call_start);
                double duration = dura/1000.0;
                sql = "INSERT INTO "+ COMPLETE_TABLE_NAME +
                        " values('"+result_two.getString("CallId")+"','"+
                        result_two.getString("CalleeName")+"','"+
                        result_two.getString("CalleeIp")+"','"+
                        result_two.getString("CallerName")+"','"+
                        result_two.getString("CallerIp")+"',"+
                        duration+")";
                stmt.executeUpdate(sql);
            }



        }

        sql = "DROP TABLE IF EXISTS "+CALLERAVERAGE_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERAVERAGE_TABLE_NAME+" "+
                "SELECT CallerName, AVG(CallDuration) AS Average "+
                "from "+COMPLETE_TABLE_NAME+" "+
                "GROUP BY CallerName";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+CALLERAVERAGECLASSIFICATION_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERAVERAGECLASSIFICATION_TABLE_NAME+"(CallerName VARCHAR(255), Average DOUBLE, GroupId VARCHAR(255))";
        stmt.executeUpdate(sql);

        sql = "SELECT * from "+CALLERAVERAGE_TABLE_NAME;
        Statement new_stmt = conn.createStatement();
        ResultSet res = new_stmt.executeQuery(sql);

        while(res.next()){
            String Callername = res.getString("CallerName");
            Double Average = res.getDouble("Average");
            String GroupId = "";
            if(Average <= 60.0){
                GroupId = "A";
            }
            else if(Average > 60.0 && Average <= 5*60.0){
                GroupId = "B";
            }
            else if(Average > 5*60.0 && Average <= 10*60.0){
                GroupId = "C";
            }
            else if(Average > 10*60.0){
                GroupId = "D";
            }
            sql = "INSERT INTO "+CALLERAVERAGECLASSIFICATION_TABLE_NAME+
                    " values('"+Callername+"','"+
                    Average+"','"+
                    GroupId+"'"+")";
            stmt.executeUpdate(sql);
        }

        sql = "DROP TABLE IF EXISTS "+CALLERFREQUENCY_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERFREQUENCY_TABLE_NAME+" "+
                "SELECT CallerName, COUNT(CallId) AS Frequency "+
                "from "+COMPLETE_TABLE_NAME+" "+
                "GROUP BY CallerName";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+CALLERCALLEEAVERAGE_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERCALLEEAVERAGE_TABLE_NAME+" "+
                "SELECT CallerName, CalleeName, AVG(CallDuration) "+
                "from "+COMPLETE_TABLE_NAME+" "+
                "GROUP BY CallerName, CalleeName";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+CALLERCALLEEFREQUENCY_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERCALLEEFREQUENCY_TABLE_NAME+" "+
                "SELECT  CallerName,CalleeName, COUNT(CallId)  AS Frequency "+
                "from "+COMPLETE_TABLE_NAME+" "+
                "GROUP BY CallerName, CalleeName";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+CALLERTOTALDURATION_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERTOTALDURATION_TABLE_NAME+" "+
                "SELECT CallerName, SUM(CallDuration) "+
                "from "+COMPLETE_TABLE_NAME+" "+
                "GROUP BY CallerName";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+CALLERBETA_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERBETA_TABLE_NAME+" "+
                "SELECT CallerName, SUM(CallDuration)/86400.0 as Beta "+
                "from "+COMPLETE_TABLE_NAME+" "+
                "GROUP BY CallerName";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+CALLERINCOMPLETEFREQUENCY_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERINCOMPLETEFREQUENCY_TABLE_NAME+" "+
                "SELECT ALL CallerName, COUNT(CallId)  AS Frequency "+
                "from "+INCOMPLETE_TABLE_NAME+" "+
                "GROUP BY CallerName";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+CALLERGAMMA_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERGAMMA_TABLE_NAME+" "+
                "SELECT CallerName, COUNT(CallerIp) as Gamma "+
                "from "+COMPLETE_TABLE_NAME+" "+
                "GROUP BY CallerName";

        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS TEMP";
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE TEMP SELECT "+CALLERFREQUENCY_TABLE_NAME+".CallerName AS P, "+CALLERFREQUENCY_TABLE_NAME+
                ".Frequency as Q, "+CALLERINCOMPLETEFREQUENCY_TABLE_NAME+
                ".CallerName as R, "+
                CALLERINCOMPLETEFREQUENCY_TABLE_NAME+
                ".Frequency AS S FROM  "+
                CALLERFREQUENCY_TABLE_NAME+" INNER JOIN "+CALLERINCOMPLETEFREQUENCY_TABLE_NAME+
                " ON "+CALLERFREQUENCY_TABLE_NAME+".CallerName = "+CALLERINCOMPLETEFREQUENCY_TABLE_NAME+".CallerName";

        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+CALLERALPHA_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERALPHA_TABLE_NAME+" "+
              "SELECT P as CallerName, Q/(Q+S) as Alpha FROM TEMP";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS TEMP";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+CALLEEFREQUENCY_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLEEFREQUENCY_TABLE_NAME+" "+
                "SELECT CalleeName, COUNT(CallId) AS Frequency "+
                "from "+COMPLETE_TABLE_NAME+" "+
                "GROUP BY CalleeName";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS TEMP";
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE TEMP SELECT "+CALLERFREQUENCY_TABLE_NAME+".CallerName AS P, "+CALLERFREQUENCY_TABLE_NAME+
                ".Frequency as Q, "+CALLEEFREQUENCY_TABLE_NAME+
                ".CalleeName as R, "+
                CALLEEFREQUENCY_TABLE_NAME+
                ".Frequency AS S FROM  "+
                CALLERFREQUENCY_TABLE_NAME+" INNER JOIN "+CALLEEFREQUENCY_TABLE_NAME+
                " ON "+CALLERFREQUENCY_TABLE_NAME+".CallerName = "+CALLEEFREQUENCY_TABLE_NAME+".CalleeName";

        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS "+CALLERRHO_TABLE_NAME;
        stmt.executeUpdate(sql);

        sql = "CREATE TABLE "+CALLERRHO_TABLE_NAME+" "+
              "SELECT P as UserName, Q/S as Rho FROM TEMP";
        stmt.executeUpdate(sql);

        sql = "DROP TABLE IF EXISTS TEMP";
        stmt.executeUpdate(sql);


        /*
        ArrayList<String> users = new ArrayList<String>();
        sql = "SELEECT User from "+USERS_TABLE_NAME;
        Statement new_stmt = conn.createStatement();
        ResultSet user_list = new_stmt.executeQuery(sql);
        while(user_list.next()){
            users.add(user_list.getString("User"));
        }
        */


        stmt.close();
        conn.close();
        System.out.println("Finished");
    }
    catch(Exception e){
        e.printStackTrace();
    }
    return ;
}
}

In this piece of code you are taking for granted than result_one is returning something and maybe that is not true. 在这段代码中,您认为理所当然的是, result_one返回的内容可能不正确。

        ResultSet result_one = stmt1.executeQuery(sql);
        sql = "SELECT * from "+PACKET_TABLE_NAME+" "+
        "where Method = 'BYE' and CallId = '"+cur_id+"'";
        ResultSet result_two = stmt2.executeQuery(sql);
        if(!result_two.next()){

            //If this return false
            result_one.next();
            sql = "INSERT INTO "+INCOMPLETE_TABLE_NAME+

                    //this is going to fail 
                    " values('"+result_one.getString("CallId")+"','"+
                    result_one.getString("CallerName")+"','"+
                    result_one.getString("CallerIp")+"','"+
                    result_one.getString("CalleeName")+"','"+
                    result_one.getString("CalleeIp")+"',"+
                    "NULL"+")";
            stmt.executeUpdate(sql);
        }

I think the problem here is that ResultSet next() method does. 我认为这里的问题是ResultSet next()方法可以。

Remember, it shifts the cursor to the next row of the result set from the database and returns true if there is any row, otherwise false. 请记住,它将光标移至数据库结果集的下一行,如果有行则返回true,否则返回false。

Your code looks as if it is not expecting the shift of the cursor to the next row. 您的代码看起来好像不希望光标移动到下一行。

For example : 例如 :

if(!result_two.next()){
   -- Some code
} else {
  -- Some code
  result_two.next(); -- Whoops!
}

Also, you are assuming a relationship between result_one and result_two . 另外,您假设result_oneresult_two之间存在关系。 Just because result_two does not return anything does not necessarily mean that result_one will! 仅仅因为result_two不返回任何内容,并不必然意味着result_one会!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM