繁体   English   中英

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

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

以下是有错误的代码:

java.sql.SQLException:结果集结束后

请帮忙。

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

在这段代码中,您认为理所当然的是, 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);
        }

我认为这里的问题是ResultSet next()方法可以。

请记住,它将光标移至数据库结果集的下一行,如果有行则返回true,否则返回false。

您的代码看起来好像不希望光标移动到下一行。

例如 :

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

另外,您假设result_oneresult_two之间存在关系。 仅仅因为result_two不返回任何内容,并不必然意味着result_one会!

暂无
暂无

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

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