Resultset in DefaultTable anzeigen lassen

11/18/2015 22:48 Wanamakbestserver#1
Hallooo soo ich habe jetzt einige Stunden damit zugebracht rauszufinden wie ich ein ResultSet in einer Defaulttable anzeigen lassen kann. Da ich im internet aber biss jetzt nix wirklich brauchbares gefunden habe wollt ich hier mal nachfragen ob es hier ein paar Tipps und Anregungen gibt :3

Soo leute habe jetzt mal was ausprobiert :

Vom Gefühl müsste das funktionieren nur : anstatt nur die erste und dritte Spalte der Tabelle aus dem ResultSet rauszunehmen und in die JTable einzufügen nimmt er die ersten 3 und schmeißt mir die Exception Das er keine NULL werte einfügen kann raus..... was nu ?

edit: habe mal in der abfrage nur nach den spalten gefragt die ich auch haben will. dennoch das problem : Habe ich einen Fehler beim Transportieren oder beim richtigen auslesen des ressultsets ? :O
11/19/2015 08:51 XxharCs#2
Der Cursor beginnt bei 1, deine for-Schleife bei 0. Du solltest aufpassen, den in einer Datenbank der Index immer bei 1 beginnt, und nicht wie in Java und anderen Programmiersprachen wie üblich ab 0.

Du kannst es auf 2 Arten machen, die eine die du angesprochen hast, die andere wär, AbstractTableModel zu überschreiben, um halt eine eigene Table zu haben, die sich um das ganze kümmert.

So bleibst du dynamisch.
Code:
ResultSet rs = cl.execute(SQL_QUERY);
ResultSetMetaData rsmd = rs.getMetaData();

int columnCount = rsmd.getColumnCount();
String[] column = new String[columnCount];
int rows = 0;

while(rs.next()) {

	rows++;
}

for(int i = 1; i <= columnCount; i++) {

	column[i - 1] = rsmd.getColumnName(i);
}

Object[][] erg = new Object[rows][columnCount];
rows = 0;
rs.beforeFirst();

while(rs.next()) {

	for(int i = 1; i <= columnCount; i++) {

		erg[rows][i - 1] = rs.getString(i);
	}
	rows++;
}

model = new DefaultTableModel(erg, column);
table.setModel(model);

rs.close();
rs = null;
Willst du aber mit einer eigenen Tabelle arbeiten(um sich sehr viel zu ersparren!), dann schaue dir AbstractTableModel an.
Aber ich zeige dir ein Beispiel, vielleicht findet man es nicht soo oft im Internet:

ResultSetTableModel
Code:
/**
 * Our own ResultSetTableModel class. Our Table model works directly with the ResultSet object, which provides easy use and work
 * with the JTable.
 * 
 * @author Stefan Stokic / XxharCs
 * @version 2.0
 */
public class ResultSetTableModel extends AbstractTableModel {

	protected ResultSet rs;
	protected int rowCount;

	/**
	 * Constructor which takes the ResultSet object.
	 * 
	 * @param rs the ResultSet object
	 * @throws SQLException if, when moving the cursor it fails
	 */
	public ResultSetTableModel(ResultSet rs) throws SQLException {

		this.rs = rs;

		rs.afterLast();
		rs.previous();
		this.rowCount = rs.getRow();
	}

	/**
	 * Returns the column count out of the meta data from the ResultSet object.
	 */
	@Override
	public int getColumnCount() {

		try {

			return rs.getMetaData().getColumnCount();

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * Returns the row count.
	 */
	@Override
	public int getRowCount() {

		return this.rowCount;
	}

	/**
	 * Returns the value at the specified row and columnIndex.
	 */
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {

		try {

			rs.absolute(rowIndex + 1);
			return rs.getObject(columnIndex + 1);

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}

	/**
	 * Sets the specified value at the specified row and columnIndex.
	 */
	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

		try {

			rs.absolute(rowIndex + 1);
			rs.updateObject(columnIndex + 1, aValue);
			rs.updateRow();

		} catch (SQLException e) {
			//throw new RuntimeException(e);
			JOptionPane.showMessageDialog(null, e.getMessage());
		}
	}

	/**
	 * Returns the column class of the specified columnIndex.
	 */
	@Override
	public Class<?> getColumnClass(int columnIndex) {

		try {

			ResultSetMetaData rsmd = rs.getMetaData();
			String typeName = rsmd.getColumnClassName(columnIndex + 1);

			return Class.forName(typeName);

		} catch (ClassNotFoundException e) {
			throw new RuntimeException(e);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * Returns the column name of the specified column.
	 */
	@Override
	public String getColumnName(int column) {

		try {

			ResultSetMetaData rsmd = rs.getMetaData();
			String columnName = rsmd.getColumnName(column + 1);

			return columnName;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * Returns if the cell is editable at the specified row and columnIndex.
	 */
	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {

		try {

			ResultSetMetaData rsmd = rs.getMetaData();
			return rsmd.isWritable(columnIndex + 1);

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
        /**
	 * Notifies the table that it's data has changed cause of the search query. The search queries return is in the ResultSet object,
	 * so it's only needed to set the new ResultSet to change the data of the table model.
	 * 
	 * @param rs the ResultSet object which contains the return of the search query
	 * @throws SQLException if the search query fails
	 */
	public void search(ResultSet rs) throws SQLException {

		this.rs = rs;

		rs.afterLast();
		rs.previous();
		this.rowCount = rs.getRow();

		this.fireTableDataChanged();
	}
}
In der Verwendung:
Code:
protected ResultSetTableModel defTableModel;
protected ConnectionLogic conLogic;
...
...
conLogic = new ConnectionLogic(this.hostname, this.username, this.password, this.dbName);
ResultSet rs = conLogic.execute(SQL_QUERY);

defTableModel = new ResultSetTableModel(rs); // creating our table model
table.setModel(defTableModel); // setting our table model to JTable
...
...
// example if we want to search something
/**
 * This method gets called when we search something in our search field.
 * 
 * @param searchedText the text we are searching for
 */
public void search(String searchedText) {

	try {

		ResultSet rs = conLogic.execute(searchedText);
		defTableModel.search(rs);

	} catch (SQLException e) {

		JOptionPane.showMessageDialog(null, "An error occured while searching in the table!");
	}
}
11/19/2015 22:10 Wanamakbestserver#3
Soo habe mal deine erste möglichkeit versucht zu machen aus gack ^^ aber das
Code:
 itemlist.setModel(model);
will er nicht da sagt er das er das net findet ka iwie ich versuch mal das andere :)

SOOO Schau mal ich wollte das jetzt mit deiner resultsettable class machen ne ich habe diesen code jetzt hier in einer methode dafür:
Habe ich da iwas übersehen oder vergessen ? :O habe mit diesen JTable dingern echt noch nie gescriptet und dementsprechend auch nie an Erfahrung sammeln können :confused: . Falls du benötigst das ist die Connect Klasse von mir
in der, der RsSet halt in das Tablemodel reingepackt werden soll ( da liegt auch der RsSet) und dann wollte ich diese methode dann in meiner GUI nutzen :)
11/20/2015 10:32 XxharCs#4
Quote:
Originally Posted by Wanamakbestserver View Post
Soo habe mal deine erste möglichkeit versucht zu machen aus gack ^^ aber das
Code:
 itemlist.setModel(model);
will er nicht da sagt er das er das net findet ka iwie ich versuch mal das andere :)

Habe ich da iwas übersehen oder vergessen ? :O habe mit diesen JTable dingern echt noch nie gescriptet und dementsprechend auch nie an Erfahrung sammeln können :confused: . Falls du benötigst das ist die Connect Klasse von mir
in der, der RsSet halt in das Tablemodel reingepackt werden soll ( da liegt auch der RsSet) und dann wollte ich diese methode dann in meiner GUI nutzen :)
Code:
itemList.setModel(model);
Funktioniert nicht/findet er nicht, weil itemList bei dir den Typ Object hat.
Du brauchst eine JTable und ein DefaultTableModel Variable.
Code:
private JTable table;
private DefaultTableModel model;
Und dann den Code von mir vom obrigen Post verwenden, um die Daten dynamisch zu holen und zu speichern und diese dann per:
Code:
model = new DefaultTableModel(erg, column);
table.setModel(model);
in die Tabelle zu setzen.
11/22/2015 02:47 Wanamakbestserver#5
joa wenn er bei mir erg und column erkennen würd ^^
11/22/2015 11:38 XxharCs#6
erg und column werden wie im ersten Post verwendet. Also sollte es kein Problem geben.