# Warum ist mein ResultSet leer?



## andkul (24. Sep 2008)

Hallo,

ich glaub ich steh grad auf der Leitung.
Ich versuche grad mit der Methode getData() ein 2dimensionales Array aufzubauen, um
es dann meinem TableModel mitzugeben. Dazu rufe ich die Methode doQuery(sql) auf, die
einen query erhält, diesen an die Datenbank sendet und den ResultSet an
getData() zurückgibt. In der Methode getData() ist mein ResultSet aber leer, obwohl der
ResultSet in der Methode doQuery() alle Daten enthält.
Was mach ich falsch? Bitte helft mit auf die Sprünge!!

besonders merkwürdig finde ich, dass die Methode getColNames() einwandfrei funktioniert und da mach ich 
ja nix anderes.

Hier die Klasse UserModel (hier ist ResultSet in der Methode getData() leer aber in getColNames() nicht!!!)

```
public class UserModel extends DefaultTableModel{

	private String tableName = "tabellenname";
	private DatabaseAccess dao = null;
	
	
	public UserModel(){
		dao = new DatabaseAccess(tableName);
		this.setDataVector(this.getData(), this.getColNames());
	}
	
	public String[][] getData(){
		String sql = "select * from " + tableName;
		ResultSet rs = dao.doQuery(sql);      
		String[][] data = new String[this.getRowCount(rs)][this.getColCount(rs)];
		try {
			int r = 0;
			int c = 0;
			while(rs.next())           //rs.next() gibt false zurück
			{
				for(c = 0; c < this.getColCount(rs); c++)
					{
						data[r][c] = rs.getString(c+1);
					}
				r++;
			}
		} catch (Exception e) {
			System.err.println("could not execute getData() algorithm");
			e.printStackTrace();
		}
		
		return data;
	}



	public String[] getColNames(){
		String sql = "describe " + tableName;
		ResultSet rs = dao.doQuery(sql);
		String[] colNames = new String[this.getColCount(rs)];
		try {
			System.out.println("getColNames() rs.next(): " + rs.next());
			int i = 0;
			while(rs.next())              //rs.next() gibt truezurück
			{
				colNames[i] = rs.getString(1);
				i++;
			}
		} catch (Exception e) {
			System.err.println("could not execute getColNames() algorithm");
			e.printStackTrace();
		}
		return null;
	}

	public int getColCount(ResultSet rs){
		int colCount = 0;
		try {
			ResultSetMetaData metaData = rs.getMetaData();
			colCount = metaData.getColumnCount();
		} catch (SQLException e) {
			System.err.println("could not initialize metaData!!");
			e.printStackTrace();
		}
		return colCount;
	}
	
	public int getRowCount(ResultSet rs){
		int rowCount = 0;
		try {
			while(rs.next()) rowCount++;
		} catch (SQLException e) {
			System.err.println("could not execute rs.next()!!");
			e.printStackTrace();
		}
		return rowCount;
	}

        ......
}
```


und hier die Klasse DatabaseAccess (hier enthält ResultSet alle Daten die es enthalten soll)

```
public final class DatabaseAccess {

	private Connection con = null;
	private Statement stmt = null;
	
	private String driverName = "Treiber";
	private String serverName = "host";
	private String dbName = "datenbankname";
	private String user = "user";
	private String pwd = "pwd";
	private String tableName;
	
	
        ....
	
	
	public ResultSet doQuery(String query){
		System.out.println("query: " + query);
		ResultSet rs = null;
		try {
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);            //rs.next() gibt truezurück
		} catch (SQLException e) {
			e.printStackTrace();
			System.err.println("could not execute following query " + query);
		}
		return rs;
	}

       ....

}
```

Vielen Dank schonmal, ich bin sicher Ihr findet den Fehler


----------



## SlaterB (24. Sep 2008)

aus einem ResultSet kann man anscheinend nur einmal die Daten auslesen, danach ist es alle,

evtl. kann man es noch auf auf Anfang zurücksetzen,
aber 

while(rs.next())  durchzulaufen in getRowCount()
und danach nochmal
while(rs.next())  in getData(),
das muss ja auf jedenfall schiefgehen,

durchlaufe die Daten nur EINMAL, fülle die String[] pro Eintrag in eine Liste dynamischer Größe und am Ende kannst du ein Array draus machen, falls gewünscht


----------



## andkul (24. Sep 2008)

ok, das leuchtet mir ein was du da sagst. Werd ich gleich mal ändern.
Vielen Dank für die prompte Antwort


----------



## SlaterB (24. Sep 2008)

> for(c = 0; c < this.getColCount(rs); c++) 


hier wird übrigens in jedem Schleifendurchlauf getColCount() aufgerufen, das ist doch unnötig,
den Wert kannst du genausogut einmal vorher als int colCount ablegen und gut ist,

zum Glück muss in diesem Fall nicht jedes Mal eine neue Query ausgeführt werden,
mit solchen Konstrukten kann man viel Ärger machen


----------



## andkul (24. Sep 2008)

stimmt, da hast du recht slater, werd ich auch gleich mal änder.
danke


----------



## andkul (24. Sep 2008)

ok, also ich musste einfach den Cursor nach jeder Verwendung des ResultSets mit rs.beforeFirst() wieder auf den Anfang setzen, das ist alles.


----------

