ResultSet Problem

pdikij

Mitglied
Guten Tag!

Ich habe momentan ein Problem in meinem "Progrämmchen"... :(

Also:

Ich möchte in einem Frame, der in zwei teilen geteilt ist, im oberen Teil vier
Tabellen aus der MySql-DB gleichzeitig anzeigen lassen um später aus den einzelnen
Tabellen ein Wert per Click auslesen und im unteren Teil in ein TextFeld reinzuschreiben.

Soweit sogut... Die Tabellen werden angezeigt, die Verbindung zur DB wird aufgebaut
aber, wenns um die Tabelleninhalte geht, bekomme ich ein Fehler, der so aussiet:

Code:
java.sql.SQLException: Operation not allowed after ResultSet closed
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
	at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:666)
	at com.mysql.jdbc.ResultSet.getMetaData(ResultSet.java:3008)
	at test1.Zuordung.showTableContent(Zuordung.java:261)
	at test1.Zuordung.initialize(Zuordung.java:229)
	at test1.Zuordung.<init>(Zuordung.java:122)
	at test1.Zuordung$1.run(Zuordung.java:113)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(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)

Könnte mir jemand mal sagen woran es liegen könnte? :confused:
Bin sehr dankbar für jede Hilfe!:rolleyes:

Hier noch der Quellcode:

Java:
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JTable;
import java.awt.GridBagLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;

public class Zuordung extends JFrame {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;
	private JPanel eingabePanel = null;
	private JPanel tabellenPanel = null;
	private JScrollPane spUser = null;
	private JScrollPane spPc = null;
	private JScrollPane spLaptop = null;
	private JScrollPane spMon = null;
	private JTable tblUser;
	private JTable tblPc;
	private JTable tblLaptop;
	private JTable tblMon;
	private String qMon="SELECT * FROM monitorbestand ORDER BY 'MonitorSN(1)' ";
	private String qUser="SELECT * FROM userzuordnung ORDER BY 'UserNR'";  
	private String qPc="SELECT * FROM pcbestand ORDER BY 'PCSN'";
	private String qLap="SELECT * FROM laptopbestand ORDER BY 'LaptopSN'";
	private Connection con = null;
	private String user = "**********";
    private String password = "***********";
    private String driverClass = "org.gjt.mm.mysql.Driver";  
    private String dbUrl = "jdbc:mysql://***************/";
    private String db ="***********";
    private DatabaseMetaData dbmd = null;
    private DefaultTableModel tblDataModelUser = null;
    private Vector clmHeaderUser = null;  
    private Vector dataVectorUser = null; 
    
	private JPanel getEingabePanel() {
		if (eingabePanel == null) {
			eingabePanel = new JPanel();
			eingabePanel.setLayout(new GridBagLayout());
		}
		return eingabePanel;
	}

	private JPanel getTabellenPanel() {
		if (tabellenPanel == null) {
			tabellenPanel = new JPanel();
			tabellenPanel.setLayout(new GridLayout(2,2,2,2));
			tabellenPanel.add(getSpUser());
			tabellenPanel.add(getSpPc());
			tabellenPanel.add(getSpLaptop());
			tabellenPanel.add(getSpMon());
		}
		return tabellenPanel;
	}

	
	private JScrollPane getSpUser() {
		if (spUser == null) {
			spUser = new JScrollPane();
		}
		return spUser;
	}

	
	private JScrollPane getSpPc() {
		if (spPc == null) {
			spPc = new JScrollPane();
		
		}
		return spPc;
	}

	
	private JScrollPane getSpLaptop() {
		if (spLaptop == null) {
			spLaptop = new JScrollPane();
		
		}
		return spLaptop;
	}

	
	private JScrollPane getSpMon() {
		if (spMon == null) {
			spMon = new JScrollPane();
		
		}
		return spMon;
	}

	public static void main(String[] args) {
		
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Zuordung thisClass = new Zuordung();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	public Zuordung() {
		super(" Zuordnung");
		initialize();
	}
	
	private void verbingungAufbauen() {
		System.out.println("Start");
		System.out.println("Treiber laden");
		try {
			Class.forName(driverClass);
		} catch (java.lang.ClassNotFoundException e) {
			System.err.print("ClassNotFoundException: ");
			System.err.println(e.getMessage());
		}

		// Verbindung zur Datenbank Aufbauen

		try {
			System.out.println("getConnection()");
			con = DriverManager.getConnection(dbUrl, user, password);
			System.out.println("executeQuery");
			Statement stmt = con.createStatement();
			stmt.execute("USE " + db);
		
			dbmd = con.getMetaData();
			System.out.println("finished\nConnection Aufgebaut");

		} catch (SQLException sqle) {
			sqle.printStackTrace();
			System.err.println(sqle.getMessage());
		}

	}

	private void initialize() {
		this.setSize(1024, 950);
		this.setContentPane(getJContentPane());
		
		
		//tbl User initialisieren
		tblLaptop = new JTable();
		tblLaptop.setEnabled(true);
		tblLaptop.setModel(new DefaultTableModel(
	            new Object [][] {
	                {null, null, null, null},
	                {null, null, null, null},
	                {null, null, null, null},
	                {null, null, null, null}
	            },
	            new String [] {
	                " ", " ", " ", " "
	            }
	        ));
	        tblLaptop.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
		
		//tbl Mon initialisieren
		tblMon = new JTable();
		tblMon.setEnabled(true);
		tblMon.setModel(new DefaultTableModel(
	            new Object [][] {
	                {null, null, null, null},
	                {null, null, null, null},
	                {null, null, null, null},
	                {null, null, null, null}
	            },
	            new String [] {
	                " ", " ", " ", " "
	            }
	        ));
	        tblMon.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
		
		//tbl PC initialisieren
		tblPc = new JTable();
		tblPc.setEnabled(true);
		tblPc.setModel(new DefaultTableModel(
	            new Object [][] {
	                {null, null, null, null},
	                {null, null, null, null},
	                {null, null, null, null},
	                {null, null, null, null}
	            },
	            new String [] {
	                " ", " ", " ", " "
	            }
	        ));
	        tblPc.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
		
		//tbl User initialisieren
		tblUser = new JTable();
		tblUser.setEnabled(true);
		tblUser.setModel(new DefaultTableModel(
	            new Object [][] {
	                {null, null, null, null},
	                {null, null, null, null},
	                {null, null, null, null},
	                {null, null, null, null}
	            },
	            new String [] {
	                " ", " ", " ", " "
	            }
	        ));
	        tblUser.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
	   
	    // ViewPorts setzten
	    spPc.setViewportView(tblPc);
		spUser.setViewportView(tblUser);
		spLaptop.setViewportView(tblLaptop);
		spMon.setViewportView(tblMon);
		verbingungAufbauen();
		showTableContent();
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setSize(500,500);
			jContentPane.setLayout(new BorderLayout());
			jContentPane.setPreferredSize(new Dimension(500, 500));
			jContentPane.add(getEingabePanel(), BorderLayout.CENTER);
			jContentPane.add(getTabellenPanel(), BorderLayout.NORTH);
		
		}
		return jContentPane;
	}
	
	private void showTableContent() {
		if (con != null && dbmd != null) {
			try {

				Statement stmt = con.createStatement();
				
				ResultSet rsUser = stmt.executeQuery(qUser);
				ResultSet rsMon = stmt.executeQuery(qMon);
				ResultSet rsPc = stmt.executeQuery(qPc);
				ResultSet rsLap = stmt.executeQuery(qLap);
				
				// inhalte User
				
				tblDataModelUser = new DefaultTableModel();
				clmHeaderUser = new Vector();
				dataVectorUser = new Vector();
				ResultSetMetaData rsmdUser = rsUser.getMetaData();
				int clmCnt = rsmdUser.getColumnCount();
				for (int i = 1; i <= clmCnt; i++){
					clmHeaderUser.addElement(rsmdUser.getColumnName(i));
				}
				while (rsUser.next()) {
					Vector rowVectorUser = new Vector();
					
					for (int i = 1; i <= clmCnt; i++) {
						rowVectorUser.addElement(rsUser.getString(i));
						
					}
					dataVectorUser.addElement(rowVectorUser);
				}
				
				tblDataModelUser.setDataVector(dataVectorUser, clmHeaderUser);

				this.tblUser.setModel(tblDataModelUser);
				this.tblUser.updateUI();

				//Inhalte Mon
				
				
		
			System.out.println("finished");

			} catch (SQLException sqle) {
				sqle.printStackTrace();
			}
		}
	}

}

P.S. Nach ausprobieren habe ich gemerkt, dass ich kein resultSet zurückkriege...
Code:
rsUser.afterLast();
System.out.println("RS: "+rsUser.getRow());
liefert eine 0 zurück!

Sieht jemand vielleicht ein Fehler bei der DB-Abfrage?
 
Zuletzt bearbeitet:
Hallo,
mal ohen deinen Code wirklich zu lese, kein Wunder das du als ResultSet o zurück bekommst. Die Methode afterLast() setzt den Courser zum Auslesen, nach der letzten Reihe. Benutze lieber last() um zur letzten Reihe zu Springen, oder next() um zur nächsten zu springen.
Tipp schau am besten in der doku mal nach, bevor du neue Methoden ausprobierst.
 
Hallo,
mal ohen deinen Code wirklich zu lese, kein Wunder das du als ResultSet o zurück bekommst. Die Methode afterLast() setzt den Courser zum Auslesen, nach der letzten Reihe. Benutze lieber last() um zur letzten Reihe zu Springen, oder next() um zur nächsten zu springen.
Tipp schau am besten in der doku mal nach, bevor du neue Methoden ausprobierst.

Hallo!
Ok, klar! War vielleicht nicht die beste Methode zum aufrufen... Danke
Also ein ResultSet hab ich doch, aber warum steht in der Fehlermeldung, dass es geschlossen ist?
Könnte mir jemand von euch ein Tip geben?

Danke im Voraus

pdikij
 
hmmm,
kannst du bitte angeben, wo der Fehler im Code auftritt? Kann dienen Code nicht Testen, da mit die DB fehlt
 
Der Fehler tritt in der Zeile:
Code:
ResultSetMetaData rsmdUser = rsUser.getMetaData();
auf! Oben im Code das ist die Zeile 257.

Eigentlich ist ja alles ok, ein ResultSet ist da...

P.S. Danke, dass du dich mit meinem Problem auseinandersetzt!:rolleyes:
 
Zuletzt bearbeitet:
Bin jetzt kein MySQL Profi, aber das Du beim Verbindungsaufbau ein 'USE DB' ausgibst kommt mir merkwürdig vor. Die zu verwendende DB kann / wird doch in der JDBC URL mit angegeben?


TIP: Vergiss nicht die ResultSets, Statements, Connection wieder zu schließen. Am besten in dem finally{} Block

Gruß
 
@torax13:
Auf dem MySQL-Server laufen mehrere DBs, deshalb auch 'USE DB'
Und danke für den Tip mit finaly{}, werd ich einbauen... :)
 
Aus der JavaDoc zum Interface Statement
By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.
Da du mit
Java:
ResultSet rsUser = stmt.executeQuery(qUser);
ResultSet rsMon = stmt.executeQuery(qMon);
ResultSet rsPc = stmt.executeQuery(qPc);
ResultSet rsLap = stmt.executeQuery(qLap);


ein neues ResultSet aus dem Statement erstellst wird das alte geschlossen.
 
Zuletzt bearbeitet:
Zurück