JTabel korrekt mit Datensätzen aus ResultSet füllen

sum41

Mitglied
Ich möchte eine JTabel dynamisch mit Daten aus einer MySQL-Datenbank füllen.

Leider werden immer die selben Datensätze angezeigt und die erste Zeile wird nicht angezeigt, wenn ich alle Daten aus der Tabelle ausgeben lassen will.
(3 Datensätze befinden sich in der Datenbank, der letzte wird nur angezeigt)

Die Klasse ResultSet bietet ja die Methode rs.beforeFirst(), um den Zeiger vor den ersten Datensatz zu setzen.
Des Weiteren die Methode next(), um zum nächsten Datensatz zu springen.

Wo genau muss ich die beiden Methoden verwenden, damit es funktioniert?
Ich bekomme immer die Exception:
"java.sql.SQLException: After end of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
at com.mysql.jdbc.ResultSetImpl.getObject(ResultSetImpl.java:4847)"
Java:
    private void btnFireSQLActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try{
        String sSQL = txtSQL.getText();
        Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection con = DriverManager.getConnection(
                "jdbc:mysql://" + DBConnection.connections[0] + "/"
			+ DBConnection.connections[3],
                    DBConnection.connections[1], DBConnection.connections[2]);
		con.setReadOnly(true);
                con.setAutoCommit(true);    
                Statement statement = con.createStatement();
                    

                if(sSQL.isEmpty()){
                    JOptionPane.showMessageDialog(rootPane, "Bitte SQL eingeben!");
                }else{
                    
   
                    ResultSet rs = statement.executeQuery(sSQL);
                   
                    ResultSetMetaData rsmd = rs.getMetaData();
                    
                    columnCount = rsmd.getColumnCount();   
              
                    Vector v = new Vector();
                    Vector v3 = new Vector();
                    
        
                   if(rs.last()){
                               rowCount = rs.getRow();
                           }
                  rs.beforeFirst();
                       for(int i = 1; i<=rowCount; i++){
                           
                       Vector v2 = new Vector();
                                 for(int iii = 1; iii<=columnCount; iii++){
                                     v2.addElement(rs.getObject(iii));
                                     rs.next();
                                }
                                 v3.add(v2);
                       }
                       
                    for(int i = 1; i<=columnCount; i++){
                        v.add(rsmd.getColumnLabel(i));
                        while(i == columnCount-1){
                            defaultTableModel.setColumnIdentifiers(v);
                            tblResults.setModel(defaultTableModel);     
                            break;
                        }
                    }
                    
                    defaultTableModel.setDataVector(v3, v);
                    JOptionPane.showMessageDialog(rootPane, rowCount+" Datensätze betroffen.");
                }   
                }catch(Exception e){
                e.printStackTrace();
            }
    }
 
Zuletzt bearbeitet:

turtle

Top Contributor
while(i == columnCount-1){
defaultTableModel.setColumnIdentifiers(v);
tblResults.setModel(defaultTableModel);
break;
}
Das sieht verdächtig aus, zumal tblResults nirgends gesetzt wird...

Eine Einführung von JTables findest du hier.

Wichtig zu wissen ist aber, das alle Controls ihre Daten getrennt in einem Model speichern, bei JTable ist es ein TableModel. Hiervon gibt es ein DefaultTableModel was häufig verwendet wird. Ich persönlich schreibe immer mein eigenes Model und erbe von AbstractTableModel.

Jedenfalls befragt eine JTable immer das zugrundeliegende Model nach den Daten, die angezeigt werden sollen. Beispielsweise, welche Spalten und welche Art von Informationen drin stehen, als auch welche Wert in einer Zeile/Spalte steckt.

Daher ist es wichtig, sich zu vergewissern, das die Daten des Resultsets korrekt im Model abgelegt werden.

Das kannst du einfach verifizieren, indem du das Model ebenfalls "befragst" und schaust, ob richtige Werte geliefert werden (getRowCount(), getColumnCount(), getValueAt(int rowIndex, int columnIndex).

Üblicherweise "verknüpft" man eine JTable mit seinem Model mit
Java:
jTable.setModel(tableModel);
Dies macht man einmal und alle Datenänderungen, wie neues Resultset, tragen die neuen Daten ins TableModel und informieren die JTable via fireXXX-Methoden, das sich das Model geändert hat, worauf die JTable neu gezeichnet wird.

Deine Beschreibung/Code spricht dafür, das das TableModel der JTable (abfragbar via jTable.getModel()) nicht richtig ist.


Ich zeige dir mal mein "Standardbeispiel" für eine JTable. Es sollte einfach übertagbar sein, wenn die Daten nicht in-memory sondern per Resultset aus einer JDBC-Query kommen und sollte ungefähr so aussehen:
Java:
 res = statement.executeQuery();
            testResultSet(res);
            ResultSetMetaData meta = res.getMetaData();
            int numberOfColumns = meta.getColumnCount();
            while (res.next())
            {
                Object [] rowData = new Object[numberOfColumns];
                for (int i = 0; i < rowData.length; ++i)
                {
                    rowData[i] = res.getObject(i+1);
                }
                dtm.addRow(rowData);
            }
            gui.jTable1.setModel(dtm);
            dtm.fireTableDataChanged();
Java:
package table;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

@SuppressWarnings("serial")
public class Table extends JPanel {
    private MeinTableModel tableModel;
    private List<Daten> listDaten;
    private JTable table;
    private JButton btnAdd;
    private Random random = new Random();

    public Table() {
	setLayout(new BorderLayout());
	// @formatter:off
		Daten[] memoryDaten = new Daten[] { 
			new Daten("Turtle", 20, false,"1.1.1993"),
			new Daten("Andreas", 10, false,"10.5.2003"),
			new Daten("Bärbel", 30, true,"20.02.1986"),
			new Daten("Christian", 40, false,"11.11.1980"),
			new Daten("Doris", 50, false,"22.02.1970"),
			new Daten("Emil", 66, true,"7.2.1966"),
			new Daten("Franziska", 70, true,"12.9.1955"),
			new Daten("Gerhard", 30, false,"16.08.1983"),
			new Daten("Heike", 33, false,"17.08.1986"),
			new Daten("Ingo", 22, false,"30.12.1992"),
		};
		// @formatter:on
	listDaten = Arrays.asList(memoryDaten);
	tableModel = new MeinTableModel(listDaten);
	table = new JTable(tableModel);
	table.setAutoCreateRowSorter(true);
	btnAdd = new JButton("Add/Reload");
	btnAdd.addActionListener(new ActionListener() {

	    @Override
	    public void actionPerformed(ActionEvent e) {
		int suffix = random.nextInt(10);
		// @formatter:off
		Daten[] neueDaten = new Daten[] { 
			new Daten("Turtle-"+suffix, 20, false, "1.1.1993"), 
			new Daten("Andreas-"+suffix, 10, false, "10.5.2003"),
			new Daten("Bärbel-"+suffix, 30, true, "20.02.1988"), 
			new Daten("Christian-"+suffix, 40, false, "11.11.1980"),
			new Daten("Doris-"+suffix, 50, false, "22.02.1970"), 
			new Daten("Emil-"+suffix, 66, true, "7.2.1966"),
			new Daten("Franziska-"+suffix, 70, true, "12.9.1955"), 
			new Daten("Gerhard-"+suffix, 30, false, "16.08.1983"),
			new Daten("Heike-"+suffix, 33, false, "17.08.1986"), 
			new Daten("Ingo-"+suffix, 22, false, "30.12.1992"), };
		// @formatter:on
		List<Daten> neuDaten = Arrays.asList(neueDaten);
		tableModel.addiereNeueDaten(neuDaten);

	    }
	});
	JScrollPane scrollPane = new JScrollPane(table);
	add(scrollPane, BorderLayout.CENTER);
	add(btnAdd, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
	JFrame frame = new JFrame("Table Test");
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.add(new Table());
	frame.pack();
	frame.setVisible(true);
    }
}

@SuppressWarnings("serial")
class MeinTableModel extends AbstractTableModel {
    private List<Daten> listDaten;
    private List<String> listColumns;

    public MeinTableModel(List<Daten> daten) {
	this.listDaten = new ArrayList<Daten>();
	for (Daten datenSatz : daten) {
	    listDaten.add(datenSatz);
	}
	listColumns = new ArrayList<String>();
	listColumns.add("Name");
	listColumns.add("Alter");
	listColumns.add("Rentner");
	listColumns.add("Geburtstag");

    }

    public void addiereNeueDaten(List<Daten> neueDaten) {
	for (Daten daten : neueDaten) {
	    listDaten.add(daten);
	}
	fireTableStructureChanged();
    }

    @Override
    public int getRowCount() {
	return listDaten.size();
    }

    public Class<?> getColumnClass(int columnIndex) {
	switch (columnIndex) {
	case 0:
	    return String.class;
	case 1:
	    return Integer.class;
	case 2:
	    return Boolean.class;
	case 3:
	    return Date.class;
	}
	return null;
    }

    @Override
    public int getColumnCount() {
	return listColumns.size();
    }

    public String getColumnName(int column) {
	return listColumns.get(column);
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
	Daten daten = listDaten.get(rowIndex);
	if (daten != null) {
	    switch (columnIndex) {
	    case 0:
		return daten.getName();
	    case 1:
		return daten.getAlter();
	    case 2:
		return daten.isRentner();
	    case 3:
		return daten.getGeburtstag();
	    }
	}
	return null;
    }
}

class Daten {
    private String name;
    private Boolean rentner;
    private Date geburtstag;
    private Integer alter;
    private SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");

    public Daten(String name, Integer alter, Boolean rentner, String geb) {
	try {
	    this.name = name;
	    this.alter = alter;
	    this.rentner = rentner;
	    this.geburtstag = sdf.parse(geb);
	} catch (ParseException e) {
	    e.printStackTrace();
	}
    }

    public String getName() {
	return name;
    }

    public void setName(String name) {
	this.name = name;
    }

    public Boolean isRentner() {
	return rentner;
    }

    public void setRentner(Boolean rentner) {
	this.rentner = rentner;
    }

    public Date getGeburtstag() {
	return geburtstag;
    }

    public void setGeburtstag(Date geburtstag) {
	this.geburtstag = geburtstag;
    }

    public int getAlter() {
	return alter;
    }

    public void setAlter(Integer alter) {
	this.alter = alter;
    }

}
 
Zuletzt bearbeitet:

sum41

Mitglied
Ich hab's jetzt mal umgebaut, aber es ist immer noch der Wurm drin.
Ich bekomme wieder nur einen Datensatz, sprich den letzten angezeigt.
In der Tabelle bleibt jede zweite Spalte leer.

Ich muss doch hier noch ein weiteres Array schreiben? Oder?


Java:
public class SQLAbfrage extends javax.swing.JFrame {
   

    StartFrame StartFrame;
    Integer columnCount;
    Integer rowCount;
    DefaultTableModel defaultTableModel;
    
    TableModelListener tableModelListener;
    
    public SQLAbfrage() {
        this.setLocationRelativeTo(StartFrame);
        initComponents();
        setVisible(true);
        setDefaultCloseOperation(SQLAbfrage.DISPOSE_ON_CLOSE);
        defaultTableModel = new DefaultTableModel(0,0);
    }

    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        txtSQL = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        btnFireSQL = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        tblResults = new javax.swing.JTable();
        jLabel2 = new javax.swing.JLabel();
        btnSaveResult = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("SQL-Abfrage");
        setMaximumSize(new java.awt.Dimension(400, 600));
        setPreferredSize(new java.awt.Dimension(400, 600));
        setResizable(false);

        txtSQL.setHorizontalAlignment(javax.swing.JTextField.LEFT);
        txtSQL.setToolTipText("");
        txtSQL.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel1.setText("SQL-Eingabe");

        btnFireSQL.setText("ausführen");
        btnFireSQL.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnFireSQLActionPerformed(evt);
            }
        });

        jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        tblResults.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        tblResults.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jScrollPane1.setViewportView(tblResults);
        tblResults.getAccessibleContext().setAccessibleName("tblResults");

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel2.setText("Abfrageergebnis");

        btnSaveResult.setText("Abfrage speichern");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addComponent(btnFireSQL)
                        .addComponent(txtSQL, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 370, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 370, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jLabel2)
                    .addComponent(btnSaveResult, javax.swing.GroupLayout.Alignment.TRAILING)))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txtSQL, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnFireSQL)
                .addGap(15, 15, 15)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnSaveResult)
                .addContainerGap(93, Short.MAX_VALUE))
        );

        txtSQL.getAccessibleContext().setAccessibleName("txtSQL");
        btnFireSQL.getAccessibleContext().setAccessibleName("btnFireSQL");
        btnSaveResult.getAccessibleContext().setAccessibleName("btnSaveResult");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 21, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void btnFireSQLActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try{
        String sSQL = txtSQL.getText();
        Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection con = DriverManager.getConnection(
                "jdbc:mysql://" + DBConnection.connections[0] + "/"
			+ DBConnection.connections[3],
                    DBConnection.connections[1], DBConnection.connections[2]);
		con.setReadOnly(true);
                con.setAutoCommit(true);    
               
                    

                if(sSQL.isEmpty()){
                    JOptionPane.showMessageDialog(rootPane, "Bitte SQL eingeben!");
                }else{
                    
                     Statement statement = con.createStatement();
                    ResultSet rs = statement.executeQuery(sSQL);
                   
                    ResultSetMetaData rsmd = rs.getMetaData();                    
                    columnCount = rsmd.getColumnCount();   

                    while(rs.next()){
                        if(rs.last()){
                        rowCount = rs.getRow();
                        }//setColumnNames
                        Object[] columns = new Object[columnCount]; 
                        for(int i = 1; i<columnCount; i++){
                            columns[i] = rsmd.getColumnName(i);
                        }
                        defaultTableModel.setColumnIdentifiers(columns);
                        //setData
                         Object[] rowData = new Object[columnCount];
                            for(int i = 1; i < columnCount; i++){
                            rowData[i]= rs.getString(i++);
                            
                            }
                         defaultTableModel.addRow(rowData);
                         
                    }

                     tblResults.setModel(defaultTableModel);
                    defaultTableModel.fireTableDataChanged();
                   
                    
                    
        //            JOptionPane.showMessageDialog(rootPane, rowCount+" Datensätze betroffen.");
                    rs.close();
                    con.close();
                    statement.close();
                }   
                }catch(Exception e){
                e.printStackTrace();
            }
    }
 

turtle

Top Contributor
Ja, ja, das unsägliche Hantieren mit Arrays beim DefaultTableModel.


Ich habs mal umgeschrieben und bei mir werden Zeilen korrekt angezeigt. Besonders solltest du darauf achten, das du über die Spalten einmal iterieren musst, aber über alle Zeilen (die wieder n-Spalten) haben. Also besteht eine Zeile in der jTable einem Vector.

Das Erzeugen des jdbc-Treibers ist ebenfalls nicht notwendig und habe es entfernt.
Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;


@SuppressWarnings("serial")
public class SQLAbfrage extends javax.swing.JFrame {
	public static void main(String[] args) {
		new SQLAbfrage();
	}

	// StartFrame StartFrame;
	Integer columnCount;
	Integer rowCount;
	DefaultTableModel defaultTableModel;
	JPanel jPanel1;
	JTextField txtSQ;
	JLabel jLabel1;
	JButton btnFireSQL;
	JScrollPane jScrollPane1;
	JTable tblResults;
	JLabel jLabel2;
	JButton btnSaveResult;

	TableModelListener tableModelListener;
	private JTextField txtSQL;

	public SQLAbfrage() {
		// this.setLocationRelativeTo(StartFrame);
		initComponents();
		setVisible(true);
		setDefaultCloseOperation(SQLAbfrage.DISPOSE_ON_CLOSE);
		defaultTableModel = new DefaultTableModel(0, 0);
	}

	
	// <editor-fold defaultstate="collapsed" desc="Generated Code">
	private void initComponents() {

		jPanel1 = new JPanel();
		txtSQL = new JTextField();
		jLabel1 = new JLabel();
		btnFireSQL = new JButton();
		jScrollPane1 = new JScrollPane();
		tblResults = new JTable();
		jLabel2 = new JLabel();
		btnSaveResult = new JButton();

		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		setTitle("SQL-Abfrage");
		setMaximumSize(new java.awt.Dimension(400, 600));
		setPreferredSize(new java.awt.Dimension(400, 600));
		setResizable(false);

		txtSQL.setHorizontalAlignment(javax.swing.JTextField.LEFT);
		txtSQL.setToolTipText("");
		txtSQL.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));

		jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
		jLabel1.setText("SQL-Eingabe");

		btnFireSQL.setText("ausführen");
		btnFireSQL.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnFireSQLActionPerformed(evt);
			}
		});

		jScrollPane1
				.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
		jScrollPane1
				.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

		tblResults.setModel(new javax.swing.table.DefaultTableModel(
				new Object[][] {

				}, new String[] {

				}));
		tblResults.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
		jScrollPane1.setViewportView(tblResults);
		tblResults.getAccessibleContext().setAccessibleName("tblResults");

		jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
		jLabel2.setText("Abfrageergebnis");

		btnSaveResult.setText("Abfrage speichern");

		javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(
				jPanel1);
		jPanel1.setLayout(jPanel1Layout);
		jPanel1Layout
				.setHorizontalGroup(jPanel1Layout
						.createParallelGroup(
								javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								jPanel1Layout
										.createSequentialGroup()
										.addContainerGap()
										.addGroup(
												jPanel1Layout
														.createParallelGroup(
																javax.swing.GroupLayout.Alignment.LEADING)
														.addGroup(
																jPanel1Layout
																		.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.TRAILING)
																		.addComponent(
																				btnFireSQL)
																		.addComponent(
																				txtSQL,
																				javax.swing.GroupLayout.Alignment.LEADING,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				370,
																				javax.swing.GroupLayout.PREFERRED_SIZE)
																		.addComponent(
																				jLabel1,
																				javax.swing.GroupLayout.Alignment.LEADING)
																		.addComponent(
																				jScrollPane1,
																				javax.swing.GroupLayout.Alignment.LEADING,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				370,
																				javax.swing.GroupLayout.PREFERRED_SIZE))
														.addComponent(jLabel2)
														.addComponent(
																btnSaveResult,
																javax.swing.GroupLayout.Alignment.TRAILING))));
		jPanel1Layout
				.setVerticalGroup(jPanel1Layout
						.createParallelGroup(
								javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								jPanel1Layout
										.createSequentialGroup()
										.addContainerGap()
										.addComponent(jLabel1)
										.addPreferredGap(
												javax.swing.LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(
												txtSQL,
												javax.swing.GroupLayout.PREFERRED_SIZE,
												100,
												javax.swing.GroupLayout.PREFERRED_SIZE)
										.addPreferredGap(
												javax.swing.LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(btnFireSQL)
										.addGap(15, 15, 15)
										.addComponent(jLabel2)
										.addPreferredGap(
												javax.swing.LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(
												jScrollPane1,
												javax.swing.GroupLayout.PREFERRED_SIZE,
												300,
												javax.swing.GroupLayout.PREFERRED_SIZE)
										.addPreferredGap(
												javax.swing.LayoutStyle.ComponentPlacement.RELATED)
										.addComponent(btnSaveResult)
										.addContainerGap(93, Short.MAX_VALUE)));

		txtSQL.getAccessibleContext().setAccessibleName("txtSQL");
		btnFireSQL.getAccessibleContext().setAccessibleName("btnFireSQL");
		btnSaveResult.getAccessibleContext().setAccessibleName("btnSaveResult");

		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
				getContentPane());
		getContentPane().setLayout(layout);
		layout.setHorizontalGroup(layout.createParallelGroup(
				javax.swing.GroupLayout.Alignment.LEADING).addGroup(
				layout.createSequentialGroup()
						.addComponent(jPanel1,
								javax.swing.GroupLayout.PREFERRED_SIZE,
								javax.swing.GroupLayout.DEFAULT_SIZE,
								javax.swing.GroupLayout.PREFERRED_SIZE)
						.addGap(0, 21, Short.MAX_VALUE)));
		layout.setVerticalGroup(layout.createParallelGroup(
				javax.swing.GroupLayout.Alignment.LEADING).addGroup(
				layout.createSequentialGroup()
						.addComponent(jPanel1,
								javax.swing.GroupLayout.PREFERRED_SIZE,
								javax.swing.GroupLayout.DEFAULT_SIZE,
								javax.swing.GroupLayout.PREFERRED_SIZE)
						.addGap(0, 0, Short.MAX_VALUE)));

		pack();
	}// </editor-fold>

	private void btnFireSQLActionPerformed(java.awt.event.ActionEvent evt) {
		try {
		       String sSQL = txtSQL.getText();
		            Connection con = DriverManager.getConnection(
		                "jdbc:mysql://" + DBConnection.connections[0] + "/"
		            + DBConnection.connections[3],
		                    DBConnection.connections[1], DBConnection.connections[2]);
		        con.setReadOnly(true);
		                con.setAutoCommit(true);    

			if (sSQL.isEmpty()) {
				JOptionPane.showMessageDialog(rootPane, "Bitte SQL eingeben!");
			} else {

				Statement statement = con.createStatement();
				ResultSet rs = statement.executeQuery(sSQL);

				ResultSetMetaData rsmd = rs.getMetaData();
				columnCount = rsmd.getColumnCount();

				Vector<Object> dataVector = new Vector<>();
				Vector<Object> columnIdentifiers = new Vector<>();
				for (int i = 1; i < columnCount; i++) {
					columnIdentifiers.add(rsmd.getColumnName(i));
				}
				while (rs.next()) {
					Vector<Object> singleRow = new Vector<>();
					for (int i = 1; i < columnCount; i++) {
						String value = rs.getString(i);
						singleRow.add(value);
					}
					dataVector.add(singleRow);
				}
				defaultTableModel = new DefaultTableModel(dataVector, columnIdentifiers);
				tblResults.setModel(defaultTableModel);
				defaultTableModel.fireTableDataChanged();
				rs.close();
				con.close();
				statement.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 

sum41

Mitglied
Nun funktioniert es.
Ich habe den Code mit den Vectoren umgeschrieben.
Der Fehler lag aber anscheinend bei diesen 3 Zeilen.
Java:
if(rs.last()){
                               rowCount = rs.getRow();
                           }

Nachdem ich diese entfernt habe, funktioniert alles. Danke!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M jTabel mit Daten Füllen Java Basics - Anfänger-Themen 5
Salo JTabel Selection listener Bsp. Java Basics - Anfänger-Themen 3
P JTabel größe ändern und button anzeigen Java Basics - Anfänger-Themen 5
R JTabel + HashMap + Checkbox Java Basics - Anfänger-Themen 4
G JTabel einlesen zeile für zeile Java Basics - Anfänger-Themen 6
L JTabel abfragen ob es eine erste Zeile gibt? Java Basics - Anfänger-Themen 2
T JTabel Zelleninhalt löschen. Java Basics - Anfänger-Themen 4
B Jtabel Inhalt vergleichen! Java Basics - Anfänger-Themen 4
H JTabel Selectionen abfangen Java Basics - Anfänger-Themen 2
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
F Aus eingelesener Datei korrekt Objekte erzeugen Java Basics - Anfänger-Themen 5
Kotelettklopfer Output korrekt trotz falschem Lösungsweg !? Java Basics - Anfänger-Themen 99
dome385 Ball Ball Kollision physikalisch korrekt Java Basics - Anfänger-Themen 5
H Endkapital wird nicht korrekt ausgegeben. Java Basics - Anfänger-Themen 5
M Warum werden character, die Leerzeichen sind, nicht korrekt verarbeitet? Java Basics - Anfänger-Themen 2
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
tom.j85 Map - Values nicht korrekt ersetzt (Abzählspiel) Java Basics - Anfänger-Themen 13
R Compiler-Fehler HalloWelt-Programm korrekt abgeschrieben, trotzdem Fehlermeldungen Java Basics - Anfänger-Themen 2
M Strasse und Huasnummer korrekt eingeben Java Basics - Anfänger-Themen 13
D JAVA JDK korrekt installieren javac wird nicht gefunden Java Basics - Anfänger-Themen 2
C JFreeChart Linie nicht korrekt dargestellt Java Basics - Anfänger-Themen 1
M java.io.FileNotFoundException trotz dass Verzeichnis korrekt angegeben ist! Java Basics - Anfänger-Themen 20
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
E Gleitkomma zahlen mathemathisch korrekt multiplizieren Java Basics - Anfänger-Themen 5
D Abfrage ob Variableninhalt korrekt Java Basics - Anfänger-Themen 5
M JMadex funktioniert nicht korrekt Java Basics - Anfänger-Themen 8
G OOP Klassenaufbau korrekt? / MVC Java Basics - Anfänger-Themen 1
R Upload Servlet: Ausgabe nicht korrekt Java Basics - Anfänger-Themen 2
J String Ausgabe nicht-leerer Zeichen nicht korrekt Java Basics - Anfänger-Themen 10
K Wie übergebe ich hier korrekt die Werte Java Basics - Anfänger-Themen 5
U Attributsnamen korrekt oder falsch? Java Basics - Anfänger-Themen 4
G Exe-Datei korrekt in JAR ablegen Java Basics - Anfänger-Themen 4
B func(Object ....args) korrekt weitergeben Java Basics - Anfänger-Themen 4
Burny91 Compiler-Fehler Regular Expressions matchen nicht korrekt Java Basics - Anfänger-Themen 5
M Tag Monat Jahr korrekt berrechnen! Java Basics - Anfänger-Themen 10
M Calendar-Prüfung funktioniert nicht korrekt Java Basics - Anfänger-Themen 6
M String wird nicht korrekt ausgelesen. Java Basics - Anfänger-Themen 11
S Kapselung Member korrekt nach aussen verfügbar machen Java Basics - Anfänger-Themen 6
L Referenced Libraries korrekt in Java Applet einbinden.. Java Basics - Anfänger-Themen 2
M OOP JLabel werden nicht korrekt eingefärbt Java Basics - Anfänger-Themen 6
F JSlider korrekt implementieren Java Basics - Anfänger-Themen 19
G byte[] (Base64) korrekt übergeben Java Basics - Anfänger-Themen 4
R ArrayList(int index, Object) funktioniert nicht korrekt? Java Basics - Anfänger-Themen 7
S Benutzereingabe über Scanner Klasse korrekt behandeln Java Basics - Anfänger-Themen 9
L If/else nicht korrekt ausgeführt. Java Basics - Anfänger-Themen 22
K methode wird nur einmal korrekt durchlaufen Java Basics - Anfänger-Themen 4
F Verschlüsselten Text korrekt ausgeben Java Basics - Anfänger-Themen 2
Developer_X Applikation kann nicht korrekt von anderen Applikationen aufgerufen werden Java Basics - Anfänger-Themen 10
K Symbole werden nicht korrekt angezeigt ? Java Basics - Anfänger-Themen 7
G Maven Dependency für Oracle JDBC-Driver korrekt festlegen Java Basics - Anfänger-Themen 4
0x7F800000 elemente aus einer Collection korrekt löschen Java Basics - Anfänger-Themen 8
Antoras Durchschnitt ist nicht korrekt; Eingaben löschen Java Basics - Anfänger-Themen 7
G Wochentag und Jahrtag werden nicht korrekt ermittelt Java Basics - Anfänger-Themen 8
G SwingWorker funktioniert nicht korrekt Java Basics - Anfänger-Themen 16
J Ein Fenster korrekt schließen? Java Basics - Anfänger-Themen 4
U Double-Variable führt Division nicht korrekt aus Java Basics - Anfänger-Themen 4
S UML korrekt umgesetzt? Java Basics - Anfänger-Themen 14
U GUI wird nicht korrekt angezeigt Java Basics - Anfänger-Themen 8
M Kommentare - so korrekt? Java Basics - Anfänger-Themen 8
G Geöffnete Datei schreiben korrekt schreiben? Java Basics - Anfänger-Themen 6
G Warum ist der folgende Code korrekt? Java Basics - Anfänger-Themen 2
G Eingabe wird nicht korrekt eingelesen? Java Basics - Anfänger-Themen 2
G Buffered REader, String, ist mein code korrekt? Java Basics - Anfänger-Themen 4
R Look & Feel wird nicht korrekt angezeigt Java Basics - Anfänger-Themen 9
N Verwaltungsproblematik beim speichern von Datensätzen Java Basics - Anfänger-Themen 5
R Zeilenweises und Tab-weises einlesen von Datensätzen Java Basics - Anfänger-Themen 5
K Probleme bei Datensätzen Java Basics - Anfänger-Themen 2
O Arbeit mit leeren Datensätzen / Objekten? Java Basics - Anfänger-Themen 5
C JMenuItems abhängig von Datensätzen in der DB Java Basics - Anfänger-Themen 3
S ArrayList, Hashmap oder Klasse zu speichern von Datensätzen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben