Problem beim übertragen von Daten: MySQL --> JTable

Genius2

Grünschnabel
Hallo Liebe Java Profis,

Ich habe ein kleines aber verzwicktes Problem mit einem Java Programm:

Ich habe diesen Code geschrieben, um Daten aus einer SQL Datenbank in eine JTable reinzukopieren.

Nun habe ich aber das Problem das der Erste Datensatz der SQL Tabelle nicht in die JTable eingetragen wird.

Ich hab schon ne Menge rumprobiert aber vielleicht bin ich auch einfach blind.

Hier mein Code:

Code:
package TableBrowserTest;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.table.DefaultTableModel;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

import TableBrowser.TableBrowserConnect;

public class TableBrowser extends JFrame {

	public static void main(String[] args) {
		new TableBrowser();
	}

	final DefaultTableModel data = new DefaultTableModel();	

	final JTextField t_user = new JTextField(20);
	final JTextField t_pw = new JTextField(20);
	final JTextField t_db = new JTextField(20);
	final JTextField t_table = new JTextField(20);

	JButton b_connect = new JButton("connect");

	JLabel l_user = new JLabel("user");
	JLabel l_pw = new JLabel("pw");
	JLabel l_db = new JLabel("db");
	JLabel l_table = new JLabel("table");
	JLabel l_empty = new JLabel(" ");

	public void updateData() {
		/* Verbindung zur DB herstellen, Statement initialisieren */

		try {
			Class.forName("com.mysql.jdbc.Driver");
			java.sql.Connection con = DriverManager.getConnection(
					"jdbc:mysql://localhost/" + t_db.getText(), t_user
							.getText(), t_pw.getText());

			/* SQL-Query ausführen und ResultSet zurückholen */
			java.sql.Statement st = con.createStatement();
			String sql = "select* from " + t_table.getText();
			ResultSet rs = st.executeQuery(sql);

			ResultSetMetaData rsmd = null;
			int clmCnt = -1;

			rsmd = rs.getMetaData();
			clmCnt = rsmd.getColumnCount();

			if (rsmd == null || clmCnt == -1) {
				throw new RuntimeException("rsmd is null");
			}

			try {
	                        rs.first();
				rs.last();
				int rowCnt = rs.getRow();
				rs.first();

				Object[][] odata = new Object[rowCnt][clmCnt];
				Object[] clmHeaders = new Object[clmCnt];
				for (int i = 1; i <= clmCnt; i++) {
					clmHeaders[i - 1] = rsmd.getColumnName(i);
				}

				int row = 0;
				while (rs.next()) {
					for (int j = 1; j <= clmCnt; j++) {
						
						System.out.print(rs.getString(j) + " ");
						odata[row][j - 1] = rs.getString(j);
					}
					row++;
					System.out.println();
				}
				data.setDataVector(odata, clmHeaders);

			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			
			data.fireTableStructureChanged();
			data.fireTableDataChanged();
			
		} catch (ClassNotFoundException e) {
			System.err.println("DB-Driver not found!");
			System.exit(1);
		} catch (SQLException e) {
			System.err.println("SQL-Error:" + e.getMessage());
			System.exit(1);
		}
	}

	public TableBrowser() {
		JFrame frame = new JFrame("Tabelle");

		frame.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		JTable tableView = new JTable(data);

		JScrollPane scrollpane = new JScrollPane(tableView);
		scrollpane.setBorder(new BevelBorder(BevelBorder.LOWERED));
		scrollpane.setPreferredSize(new Dimension(430, 200));

		// ***********************************************************
		// TableBrowserConnect
		JPanel conpane = new JPanel(new GridLayout(2, 5));

		conpane.add(l_user);
		conpane.add(l_pw);
		conpane.add(l_db);
		conpane.add(l_table);
		conpane.add(l_empty);

		conpane.add(t_user);
		conpane.add(t_pw);
		conpane.add(t_db);
		conpane.add(t_table);

		conpane.add(b_connect);

		b_connect.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				updateData();
			}
		});

		// Ende von TableBrowserConnect
		// ***********************************************************

		Container content = getContentPane();
		content.setLayout(new BorderLayout());

		content.add(conpane, BorderLayout.NORTH);
		content.add(scrollpane, BorderLayout.SOUTH);

		setSize(550, 300);
		setVisible(true);
	}
}

Das kommt beim ausführen des Programms raus:

http://s1b.directupload.net/images/090423/mzhhowfk.jpg

Und diese Daten sind in der Datenbank eigentlich drin:

http://s10b.directupload.net/images/090423/kc7mpuz4.jpg

Man sieht das die Erste Zeile der SQL Datenbank nicht in die JTable übertragen wird.

Es hat auch nix direkt mit dem Eintragen ins JTable zu tun denn auf der Console kommen auch nur diese beiden Datensätze an die auch ins JTable eingetragen sind:

http://s10.directupload.net/images/090423/6roh7cbo.jpg


Ich würde mich freuen wenn mir jemand helfen könnte den Fehler zu lokalisieren.
Und habt bitte Nachsicht ich bin auf dem Gebiet noch Anfänger.

Danke Euch im Vorraus
 
Hallo,

du bewegst den Cursor durch den Aufruf von first() schon auf den ersten Datensatz. Durch den Aufruf von next() in der while-Schleife schaltest du dann direkt weiter, womit der zweite Datensatz als erster ausgelesen wird. Damit das mit deiner while-Schleife funktioniert, musst du den Cursor vor dem ersten Datensatz platzieren. Die dazugehörige Methode lautet beforeFirst().

hth
THMD
 
Zurück