2017-03-24 4 views
0

Es folgt der Code mit Fehlern:"java.sql.SQLException: Nach dem Ende der Ergebnismenge" Fehler

java.sql.SQLException: Nach dem Ende des Ergebnisses

gesetzt

Bitte helfen.

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

Welche Zeile wirft den Fehler auf? –

+2

Könnten Sie bitte Exception-Stack-Trace hinzufügen? – Deepak

+0

Ich sehe, Sie haben eine Reihe von Verbindungen und Ergebnismengen geöffnet, ohne sie zu schließen. Das ist eine schlechte Übung, auch wenn GC sich irgendwann darum kümmern wird. –

Antwort

0

In diesem Stück Code, den Sie selbstverständlich als result_one nehmen ist etwas Rückkehr und vielleicht ist das nicht wahr.

 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); 
     } 
+0

Bitte Korrektur geben –

0

Ich denke, das Problem hier ist, dass ResultSet next() Verfahren der Fall ist.

Denken Sie daran, es verschiebt den Cursor auf die nächste Zeile der Ergebnismenge aus der Datenbank und gibt True zurück, wenn es eine Zeile gibt, sonst falsch.

Ihr Code sieht so aus, als erwarte er nicht die Verschiebung des Cursors zur nächsten Zeile.

Zum Beispiel:

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

Auch sind Sie eine Beziehung zwischen result_one und result_two annimmt. Nur weil result_two nichts zurückgibt, bedeutet dies nicht unbedingt, dass result_one wird!

+0

Dann was sollte die Korrektur sein? –

+0

Verstehen Sie das Problem und Sie sollten in der Lage sein, die korrigierte Antwort selbst zu codieren. Gib einem Mann eine Angel statt einem Fisch usw –

Verwandte Themen