# JTable befüllen



## Gast (14. Mai 2004)

Hallo,
ich habe folgendes problem ich will eine JTable mit Vectoren aus der Datenbank befüllen damit
sie beim ausführen Datensätze hat welche geändert, gelöscht usw. werden können. Nun hab
ich auch schon ein kleines programm, es kompiliert fertig aber beim starten kommt eine fehlermeldung
folgender Art: Fehler bei Tabellenabfrage java.sql.SQLException: Invalid handle
Die Exception wird bei der Abfrage selbst geworfen, also nicht bei der Treiber 
Initialisierung oder sonstwas anderes, kann sich wer meiner annehmen 

lG Fridolin


```
try 
      {    
      Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); 
      } 
             
      catch( ClassNotFoundException event ) 
      {    
      System.out.println ( "Fehler bei ODBC-JDBC Treiber Initialisierung" + event ); 
      return; 
      }    
             
      Connection con02 = null; 
       Statement stmt02; 
       String url02 = "jdbc:odbc:Datenbank"; 
       ResultSet rSet02 = null; 
       String sqlQuery02 = "SELECT * FROM Datenbank;"; 
                
         try 
         { 
         con02 = DriverManager.getConnection( url02,"User","Password" ); 
         stmt02 = con02.createStatement(); 
         rSet02 = stmt01.executeQuery( sqlQuery02 ); 
         ResultSetMetaData metadata = rSet02.getMetaData(); 
         rows = new Vector(); 
            while( rSet02.next() ) 
            { 
            Vector newrow = new Vector(); 
             
            for(int a = 1; a <= metadata.getColumnCount(); a++) 
            { 
            newrow.addElement(rSet02.getObject(i)); 
            } 
            rows.addElement(newrow); 
             
            } 
             
            stmt02.close(); 
            Vector spalten = new Vector(); 
             //int numberOfColumns = metadata.getColumnCount(); 
            //for (int column = 0; column < numberOfColumns; column++) 
            //{ 
            // columnNames.addElement(metaData.getColumnLabel(column + 1)); 
            //} 
            spalten.addElement("ID"); 
            spalten.addElement("NAME"); 
            spalten.addElement("DAUER"); 
            spalten.addElement("ALTER"); 
       
            model = new DefaultTableModel(spalten, rows) 
            { 
               public boolean isCellEditable(int row, int col) 
               { 
                return false; 
                } 
            };    
             
            table = new JTable(); 
            table.setBounds(30,105,540,150); 
            table.setRowHeight(20); 
            table.setRowMargin(0); 
            table.setShowHorizontalLines(true); 
            table.setShowVerticalLines(true); 
            table.setGridColor(Color.black); 
            table.setSelectionForeground(Color.white); 
            table.setRowSelectionAllowed(true); 
            table.setColumnSelectionAllowed(false); 
            table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
            table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
            table.addMouseListener(new Mausklasse()); 
            table.setModel(model); 
            ziehen = new JScrollPane(table); 
            ziehen.setBounds(30,105,540,150); 
             //int hpolicy = ziehen.getHorizontalScrollBarPolicy(); 
             //int vpolicy = ziehen.getVerticalScrollBarPolicy(); 
             ziehen.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
             ziehen.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
             panel.add(ziehen); 
         } 
                  
           catch( SQLException event) 
         { 
         System.out.println( "Fehler bei Tabellenabfrage " + event);    
         return; 
         }    
                   
            finally 
            { 
                      
                  try 
                  { 
                  if ( con02 != null ) 
                 { 
                 con02.close(); 
                  } 
                  } 
                      
                  catch ( SQLException event ) {} 
                       
             }
```


----------



## Mr. Floppy (17. Mai 2004)

ich meine du musst die tabelle angeben, nicht die datenbank.

SELECT * FROM <tabelle>;  nicht SELECT * FROM <datenbank>

mit select werden tabellen abgefragt, wenn du den inhalt einer datenbank
wissen willst musst du "show tables" oder sowas nehmen.


----------



## P3AC3MAK3R (17. Mai 2004)

Mr. Floppy hat gesagt.:
			
		

> ich meine du musst die tabelle angeben, nicht die datenbank.
> 
> SELECT * FROM <tabelle>;  nicht SELECT * FROM <datenbank>


Das kann ich nur bestätigen.


```
select * from [datenbank]
```

ist definitiv Unsinn.


----------



## baer1208 (17. Okt 2004)

hy!

hab auchn problem mit d JTable!
alles gemacht...klassen aufgeteilt: Main, Gui, PanelTableGet, ModelGet, VideoControler, Video, Statements, ConnectionControler...gibt no mehr, aber für mein problem irrelevant!

in d gui steht nur das aussehn...BorderLayout.CENTER, BorderLayout.WEST (navigation) navi auch über JMenu...
mit klick auf "get" in d gui öffnet sich PanelTableGet (JInternalFrame...Observer,Observable)...da drinn hab ich jez nochmal nen button gemacht (get) dass er ne bestimmte query ausführt (querys werden in "Statements" durchgeführt...das ResultSet wird zum VideoControler hinzugefügt (in nen vector)...sodale...
bis jez ganz schön,nimm i halt an...angezeigt wird jedoch nichts...hab jez im ModelGet (implements TableModel) noch nen vector, dem der Inhalt aus dem Vector im VideoControler hinzugefügt wird...und dann sollte das doch in meiner JTable stehn,oder nicht???

nja...viel text...anbei noch code:
class VideoControler:

```
import java.util.*;
/**
*Video-Objekte werden in einer ArrayList gespeichert
*um weiters in der Gui ausgegeben werden zu können
*@author ...
*/
public class VideoControler
{
  private Vector videos;
  private int row;

  public VideoControler() { videos = new Vector(); }
    
  public void add(Video v) { videos.add(v); }
  
  public Video getByTitel(String titel){
    Iterator iterator = videos.iterator();
    while(iterator.hasNext()) {
      Video video= (Video)iterator.next();
      if (video.getTitel().equalsIgnoreCase(titel))
        return video;
    }
    return null;
  }
  
  public Object getVideoOutOfVector(int i) {
  	Video v = (Video)videos.get(i);
  	return v;
  }
  
  public void clearAL() { videos.clear(); }
  public int getRowCountO() { return videos.size(); }
}
```


```
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.table.*;
import javax.swing.event.*;

/**
*JInternalFrame (JPanel): besteht aus einer JTable und 3 Buttons
*@author 
*/

public class PanelTableGet extends JInternalFrame //implements Observer{
	{
	static int openFrameCount = 0;
  static final int xOffset = 30, yOffset = 30;
	
	//private Model model = new Model();
	private JTable table1 = new JTable();//(model);
	private JScrollPane spane1 = new JScrollPane(table1);
	private VideoControler videoc;
	private ModelGet modelget;
	private Statements stmt;
	
	public PanelTableGet() {
		super("Get #" + (++openFrameCount), 
              true, //resizable
              true, //closable 
              true, //maximizable
              true);//iconifiable
    		
		JPanel contentPane;
		contentPane = (JPanel) this.getContentPane();
		contentPane.setLayout(new BorderLayout());		
		JPanel panel1 = new JPanel();
		initPanel(panel1);		
		contentPane.add(spane1, BorderLayout.CENTER);
		contentPane.add(panel1, BorderLayout.SOUTH);				
		//setWindowSize
		int inset = 100;
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        this.setBounds(inset, inset,
                  screenSize.width  - inset*2,
                  screenSize.height - inset*2);		
		//Set the window's location.
    setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
	}
	
	private void initPanel(JPanel p) {
		JButton okB = new JButton("ok");
		JButton getB = new JButton("get");
		JButton exportB = new JButton("export");
		JButton closeB = new JButton("close");
		
		closeB.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) { close(e);	}
		});	
		getB.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) { get(e); }
		});
		p.setLayout(new FlowLayout());
		p.add(getB);
		p.add(okB);
		p.add(exportB);
		p.add(closeB);
	}
	
	//Events
	private void get(ActionEvent e) {
		stmt.showVideo();
		//modelget = new ModelGet();
	}
	private void close(ActionEvent e) {
		openFrameCount--;
		this.dispose();
	}
	
}
```


```
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.*;
import java.awt.event.*;
import java.awt.*;

/**
*TableModel für PanelTableGet
*übernimmt die Anordnung von columns u rows für die JTable
*@author 
*/
class ModelGet implements TableModel {
	
	private Vector videos = new Vector();
	private Vector listeners = new Vector();
	private VideoControler videoc;
	
	public void addVideo(Video video) {
		//Index des Videos
		int index = videoc.getRowCountO();
		for (int in = 0 ; in < index; in++) {
			videos.add(videoc.getVideoOutOfVector(in));
		}
		
		//Listeners werden benachrichtigt
		//zuerst Event, "neue Row an der Stelle index" herstellen
		TableModelEvent e = new TableModelEvent (this, index, index, 
			TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);
		//Event verschicken
		for(int i = 0, n = listeners.size();i<n;i++) {
			((TableModelListener)listeners.get(i)).tableChanged(e);
		}
	}
	//Anzahl Columns
	public int getColumnCount() { return 4; }
	//Anzahl Videos
	public int getRowCount() { return videoc.getRowCountO(); }
	
	public String getColumnName(int column) {
		switch(column) {
			case 0: return "id";
			case 1: return "titel";
			case 2: return "schauspieler";
			case 3: return "anzahl";
			default: return null;
		}
	}
	//Wert der Zeile (rowIndex, ColumnIndex)
	public Object getValueAt(int rowIndex, int columnIndex) {
		Video video = (Video)videos.get(rowIndex);
		
		switch(columnIndex) {
			case 0: return new Integer(video.getId());
			case 1: return video.getTitel();
			case 2: return video.getSchauspieler();
			case 3: return new Integer(video.getAnzahl());
			default: return null;
		}
	}
		
	//eine Angabe, welchen Typ von Objekten in den Columns angezeigt werden soll
	public Class getColumnClass(int columnIndex) {
		switch(columnIndex) {
			case 0: return Integer.class;
			case 1: return String.class;
			case 2: return String.class;
			case 3: return Integer.class;
			default: return null;
		}
	}	
	public void addTableModelListener(TableModelListener l) { listeners.add(l); }	
	public void removeTableModelListener(TableModelListener l) { listeners.remove(l); }		
	public boolean isCellEditable(int rowIndex, int ColumnIndex) { return false; }		
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) { //nicht beachten 
	}
}
```


```
import java.sql.*;
import javax.swing.*;
import java.util.*;

/**
*hier stehen die statements,die ausgeführt werden
*@author
*/

public class Statements {
	
	Connection con;
	Statement stmt;
	ResultSet rs;
	VideoControler videoc;
	
	int id;
	String schauspieler;
	int anzahl;
	String titel;
		
	public Statements() {
		try { 
			ConnectionControler.getConnection();
		} catch (Exception e) {
				System.err.println(e);
		}
	}
	
	public void showVideo() {
		String query = "SELECT * FROM videos";
		try {
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);			
			while(rs.next()) {
				id = rs.getInt("id");
				titel = rs.getString("titel");
				schauspieler = rs.getString("schauspieler");
				anzahl = rs.getInt("anzahl");
				Video video = new Video(id,titel,schauspieler,anzahl);
				videoc.add(video);				
			}
			rs.close();
			stmt.close();
		} catch (Exception e) {
				System.err.println(e); System.out.println("Fehler in showVideo()");
		}
	}
}
```
bitte schreibt mir keinen link zur FAQ...da hab ich schon nachgelesen, u nichts gefunden was mir dazu helfen kann...

meiner meinung liegt mein problem mit den vielen klassen...

tia
ciao baer


----------



## baer1208 (17. Okt 2004)

hy!
weiß keiner ne antwort?
ich bekomm jetzt schon die tabellennamen angezeigt, doch nicht die inhalte der tabelle in der db...
alle bsp mit tables die ich bis jez gfundn hab san mit at time erzeugten objekten...nicht mit db-result sets...

bitte um hilfe! is echt wichtig!
kleiner ansatz wär super!! mehr will i net!


----------



## abollm (18. Okt 2004)

P3AC3MAK3R hat gesagt.:
			
		

> Mr. Floppy hat gesagt.:
> 
> 
> 
> ...



@P3AC3MAK3R:
Dann, wenn es kein so ansprechbares DB-Objekt mit dem Namen "Datenbank" gibt. Ansonsten kann das schon funktionieren. In Oracle oder MySQL erhält man bei ansonsten korrektem Code einen Fehler wie folgt:

Table or View does not exist...
Table 'mysql.datenbank' doesn't exist ...


----------

