Visualizzazione dei risultati da 1 a 7 su 7

Discussione: SQLException...

  1. #1

    SQLException...

    ...salve, ho creato una applicazione web basata su JSP, sarebbe un guestbook. Il mio problema risiede al momento in cui si inserisce un nuovo messaggio in questo guestbook. Il database viene aggiornato con successo con i nuovi dati, però viene comunque lanciata una SQLException con messaggio: "Operation not allowed after ResultSet closed ". Ma io non capisco perchè l'operazione statement.execute (query) non utilizza nessun ResultSet, quindi non capisco come quest'ultimo possa avere a che fare con il problema...

    questo è il codice della pagina jsp che contiene 1 metodo per leggere e uno per aggiornare il database, a noi interessa il metodo addGuest, e ripeto, il database viene aggiornato correttamente...

    codice:
    package beans;
    
    import java.sql.SQLException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    
    public class GuestDataBean
    {
    	private Connection connection;
    	private Statement statement;
    	private ResultSet resultSet;
    	
    	public GuestDataBean() throws Exception
    	{
    		Class.forName ("com.mysql.jdbc.Driver");
    		
    		connection = DriverManager.getConnection ("jdbc:mysql://localhost/guestbook", "root", "");
    		statement = connection.createStatement();
    		
    		resultSet = statement.executeQuery ("SELECT firstName, lastName, email FROM guests");
    	}
    	
    	public ArrayList < GuestBean > getGuestList() throws SQLException
    	{
    		ArrayList < GuestBean > guestList = new ArrayList < GuestBean >();
    		
    		resultSet.beforeFirst();
    		
    		while (resultSet.next())
    		{
    			GuestBean guest = new GuestBean();
    			
    			guest.setFirstName (resultSet.getString (1));
    			guest.setLastName (resultSet.getString (2));
    			guest.setEmail (resultSet.getString (3));
    			
    			guestList.add (guest);
    		}
    		
    		try
    		{
    			statement.close();
    			connection.close();
    		}
    		catch (Exception exception) {}
    		
    		return guestList;
    	}
    	
    	public void addGuest (GuestBean guest) throws SQLException
    	{
    		String firstName = guest.getFirstName();
    		String lastName = guest.getLastName();
    		String email = guest.getEmail();
    		
    		statement.execute ("INSERT INTO guests (firstName, lastName, email) VALUES ('" + firstName + "', '" + lastName + "', '" + email + "')");
    		
    		try
    		{
    			statement.close();
    			connection.close();
    		}
    		catch (Exception exception) {}
    	}
    }
    Spero che qualcuno possa aiutarmi

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: SQLException...

    Originariamente inviato da Dreamer89
    però viene comunque lanciata una SQLException con messaggio: "Operation not allowed after ResultSet closed ".
    Non sono sicuro che sia quello il problema ma comunque è bene precisarlo: per delle INSERT si usa tipicamente executeUpdate(), non execute().


    P.S. piccola nota sulla gestione delle eccezioni. Può andare anche bene che catturi e "zittisci" le eccezioni per le due close(). Ma c'è una piccola falla. Se prima di quel punto salta fuori una eccezione (es. causata dal next() in getGuestList() o dalla esecuzione della INSERT in addGuest() ), si esce subito dal tuo metodo e quel try/catch con le 2 close non viene affatto eseguito.

    Meglio fare un try/finally di tutto nel metodo e nel finally se vuoi "zittire" le eccezioni delle close, metti lì un try/catch.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ok ma non questo il problema, ho provato a fare un programmino che faccia le stesse istruzioni, per cercare di capire un pò dov'è l'errore:

    codice:
    import java.sql.*;
    
    public class testdb
    {
    	public static void main (String[] args)
    	{
    		try
    		{
    			Class.forName ("com.mysql.jdbc.Driver");
    			
    			Connection connection = DriverManager.getConnection ("jdbc:mysql://localhost/guestbook", "root", "");
    			Statement statement = connection.createStatement();
    			
    			ResultSet resultSet = statement.executeQuery ("SELECT * FROM guests ORDER BY lastName");
    			
    			while (resultSet.next())
    			{
    				System.out.printf ("%-12s %12s %-12s\n", resultSet.getString (1), resultSet.getString (2), resultSet.getString (3));
    			}
    			
    			String firstName = "Pippo";
    			String lastName = "Franco";
    			String email = "bassoovbzooouuu@perrooooooouuuu.au";
    			
    			statement.execute ("INSERT INTO guests (firstName, lastName, email) VALUES ('" + firstName + "', '" + lastName + "', '" + email + "')");
    			
    			statement.close();
    			connection.close();
    		}
    		catch (Exception exception)
    		{
    			exception.printStackTrace();
    		}
    	}
    }
    Ho eseguito praticamente le stesse interazioni col database dell'esempio precedente, però qui non mi da nessun errore... o_O

  4. #4
    Evidentemente prima di richiamare addGuest richiami getGuestList che ti chiude la variabile statement
    Al mio segnale... scatenate l'inferno!

  5. #5
    Originariamente inviato da R@ve M@ster
    Evidentemente prima di richiamare addGuest richiami getGuestList che ti chiude la variabile statement
    No no, nella pagina in cui si inserisce il messaggio, viene richiamato solo addGuest del GuestDataBean che ha visibilità richiesta, non sessione... che cose strane

  6. #6
    Raga ho provato a modificare in questo modo:

    codice:
    package beans;
    
    import java.sql.SQLException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    
    public class GuestDataBean
    {
    	private Connection connection;
    	private Statement statement;
    	private ResultSet resultSet;
    	
    	public GuestDataBean() throws Exception
    	{
    		Class.forName ("com.mysql.jdbc.Driver");
    		
    		connection = DriverManager.getConnection ("jdbc:mysql://localhost/guestbook", "root", "");
    		statement = connection.createStatement();		
    	}
    	
    	public ArrayList < GuestBean > getGuestList() throws SQLException
    	{
    		resultSet = statement.executeQuery ("SELECT firstName, lastName, email FROM guests");
    		
    		ArrayList < GuestBean > guestList = new ArrayList < GuestBean >();
    		
    		resultSet.beforeFirst();
    		
    		while (resultSet.next())
    		{
    			GuestBean guest = new GuestBean();
    			
    			guest.setFirstName (resultSet.getString (1));
    			guest.setLastName (resultSet.getString (2));
    			guest.setEmail (resultSet.getString (3));
    			
    			guestList.add (guest);
    		}
    		
    		try
    		{
    			statement.close();
    			connection.close();
    		}
    		catch (Exception exception) {}
    		
    		return guestList;
    	}
    	
    	public void addGuest (GuestBean guest) throws SQLException
    	{
    		String firstName = guest.getFirstName();
    		String lastName = guest.getLastName();
    		String email = guest.getEmail();
    		
    		statement.executeUpdate ("INSERT INTO guests (firstName, lastName, email) VALUES ('" + firstName + "', '" + lastName + "', '" + email + "')");
    		
    		try
    		{
    			statement.close();
    			connection.close();
    		}
    		catch (Exception exception) {}
    	}
    }
    Ho spostato la SELECT dal costruttore al metodo getGuestList, così viene richiamata solo se necessaria. E stavolta, dopo aver inserito un messaggio (che comunque riesce ad inserirsi nel database), viene lanciata una nuova SQLException: "No operations allowed after statement closed." Come se il resultSet di prima e lo statement, avessero solo visibilità costruttore, ma io le ho dichiarate fuori dal costruttore... come è possibile? o_O

  7. #7
    Finalmente sono riuscito a risolvere! Il problema era nella jsp, prima avevo dichiarato l'oggetto GuestDataBean con visibilità richiesta, ora ho modificato e ho messo visibilità pagina, e funziona :P Potete chiudere

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.