# Sql Anfrage wirft Exception



## metalfan (17. Apr 2006)

```
if (obj instanceof JButton)
    	{
    		System.out.println("Ereignis");
    		if (event.getActionCommand()=="suchen")
    		{
    		
    			
    			String eingabelaenge = textfield1.getText();
            	if (eingabelaenge.length() < 3) 
        		{
    				JOptionPane.showMessageDialog(this,
    						"Minimale Eingabe: 3 Zeichen.");
        		}
            	else
            	{
            		// Suchanfrage
            		Sql query = new Sql();
            		ResultSet test = query.search(textfield1.getText());
            		try 
            		{
            			while(test.next())
            			{
            			  
            				String surname = test.getString("Surname");
            				String firstname = test.getString("First Name");
            				String titel = test.getString("Titel");
            				String type = test.getString("Type");
            				System.out.print("Surname: "+surname+" -----First Name:----- "+firstname+
            						" -----Titel:----- "+titel+"----- Typ:----- "+type+"\n");
            			}
            		}
            	  	catch( Exception e ) 
            	  	{
            	  		e.printStackTrace();
            	  	}
            	}





import java.sql.*;

public class Sql 
{
	ResultSet rs;
  
	public static void main(String args[])
	{

	  	}
  	
	public ResultSet search(String suche)
	{
		try 
		{
			Statement stmt;
			//ResultSet rs;
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://localhost:3306/stahl";
			Connection con =  DriverManager.getConnection(url,"buch", "buch");
			stmt = con.createStatement();
			//rs = stmt.executeQuery("select * from Book B, Item I WHERE B.Itemidentity = I.Identity");
			
			rs = stmt.executeQuery("SELECT Surname, `First Name`, Type, Titel " +
					"FROM `Item_All_Author`, Author, Item, Mediatype " +
					"WHERE (((`Item_All_Author`.AuthorIdentity = Author.Identity) " +
					"AND (`Item_All_Author`.ItemIdentity = Item.Identity) " +
					"AND (Item.MediatypeIdentity = Mediatype.Identity)) " +
		  			"AND ((Author.Surname = '"+suche+"') OR (Author.`First Name` = '"+suche+"')))");
		  
			con.close();
		}
	  	catch( Exception e ) 
	  	{
	  		e.printStackTrace();
	  	}
	  	return rs;
  	}
}
```


java.sql.SQLException: Operation not allowed after ResultSet closed
	at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:639)
	at com.mysql.jdbc.ResultSet.next(ResultSet.java:6116)
	at UsingLayoutManagers.actionPerformed(UsingLayoutManagers.java:330)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)


Diese kleine Fehlermeldung wirft mir java aus wenn das Ereignis ausgelöst wird...
Passieren soll folgendes: Eingabe auslesen, Instanz der Klasse Sql erstellen, suche(); Ergebnis ausgeben.
Ab wann ist ein resultset closed?


Julius


----------



## André Uhres (17. Apr 2006)

Mit con.close(); ist auch das ResultSet closed.


----------



## Fretful (18. Apr 2006)

da kann ich dir die Prepared Statements nur ganz dick ans herz legen ! Hatte am anfang auch son kauderwasch da stehen wo sich kein sch**** auskannte aber dank prepared statements ist das nun übersichtlich ! 

http://www.galileocomputing.de/openbook/javainsel4/javainsel_20_011.htm#Xxx999378


----------



## metalfan (18. Apr 2006)

```
public ResultSet search(String suche)
	{
		try 
		{
			Statement stmt;
			//ResultSet rs;
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://localhost:3306/stahl";
			Connection con =  DriverManager.getConnection(url,"buch", "buch");
			stmt = con.createStatement();
			//rs = stmt.executeQuery("select * from Book B, Item I WHERE B.Itemidentity = I.Identity");
			
			rs = stmt.executeQuery("SELECT Surname, `First Name`, Type, Titel " +
					"FROM `Item_All_Author`, Author, Item, Mediatype " +
					"WHERE (((`Item_All_Author`.AuthorIdentity = Author.Identity) " +
					"AND (`Item_All_Author`.ItemIdentity = Item.Identity) " +
					"AND (Item.MediatypeIdentity = Mediatype.Identity)) " +
		  			"AND ((Author.Surname = '"+suche+"') OR (Author.`First Name` = '"+suche+"')))");
			return rs;
		  	con.close();
		}
	  	catch( Exception e ) 
	  	{
	  		e.printStackTrace();
	  	}
	  	
  	}
```

setze ich return rs; con.close(); geht nichts mehr:
1. Eclipse mekert das diese Methode ein Ergebnis von Typ ResultSet zurückgeben
2. con.close(); - unerreichbarer code?

return rs; sollte doch funktionieren da rs noch nicht geschlossen ist und erreichbar ist oder nicht?

Julius


----------



## AlArenal (18. Apr 2006)

Natürlich macht das keinen Sinn. Nach einem return kann nichts mehr in einer Methode ausgeführt werden, weil der Programmablauf ja zur aufrufenden Methode zurückkehrt (aka "returnt")...


----------



## metalfan (20. Apr 2006)

Da die Abfragen in einer anderen Klasse als die GUI Darstellung stattfinden soll kam mir der oben vorgestellte Gedanke alles in die Abfrage Methode reinzupacken, liegt es am typ ResutSet das dies nicht klappt?
es muss doch möglich sein innerhalb dieser Methode if abfragen einzusetzen?

Julius


----------

