# H2 - Datenbankabfrage gibt NULL aus?



## Extremefall (29. Mai 2011)

Hallo,
ich habe neu mit H2 angefangen. Die ersten Tests funktionierten. Nun habe ich versucht, über mehrere Methoden mehr übersichtlichkeit in das ganze hereinzubringen. Leider habe ich nun einen Fehler. Bei der Ausgabe wird null ausgegeben. Mein Code:

```
import java.sql.*;

public class DataBase {
	private static Connection conn;

	public static void createConnection(String database, String username,
			String password) throws Exception {
		Class.forName("org.h2.Driver");
		conn = DriverManager.getConnection("jdbc:h2:~/" + database, username,
				password);
		// add application code he
	}

	public static void closeConnection() throws SQLException {
		conn.close();
	}

	public static ResultSet setStatement(String SQLCommand) throws SQLException {
		ResultSet rs = conn.createStatement().executeQuery(SQLCommand);
		return rs;
	}

	private static int getCountRows(ResultSet sqlStatement) throws SQLException {
		ResultSet rs = sqlStatement;
		int i = 0;
		while (rs.next()) {
			System.out.println("Drina");
			i++;
		}
		return i;
	}

	public static String[] dbRequest(ResultSet sqlStatement, String field)
			throws SQLException {
		ResultSet rs = sqlStatement;
		String[] dbresults = new String[getCountRows(rs)];
		int pos = 0;
		while (rs.next()) {
			System.out.println("drin");
			dbresults[pos] = rs.getString("LEHRER");
			pos++;
		}
		for (int i = 0; i < dbresults.length; i++) {
			System.out.println(dbresults[i]);
		}
		return dbresults;
	}

	public static void main(String[] args) throws Exception {
		createConnection("test", "sa", "");
		String[] dbresults = dbRequest(setStatement("SELECT * FROM TIMETABLE"),
				"LEHRER");
		for (int i = 0; i < dbresults.length; i++) {
			System.out.println(dbresults[i]);
		}
		closeConnection();
	}

}
```
Der Fehler scheint in der Methode dbRequest zu liegen, da diese nicht in die While Schleife geht:

```
while (rs.next()) {
			System.out.println("drin");
			dbresults[pos] = rs.getString("LEHRER");
			pos++;
		}
```

Wisst ihr, woran das liegen könnte? Denn da wird der Fehler liegen. 

Danke schonmal.


----------



## XHelp (29. Mai 2011)

Ohne jetzt in den etwas komischen Aufbau genauer einzusteigen: es liegt vermutlich daran, dass du ständig das selbe ResultSet hin und her schiebst und es vermals bis zum Schluss durchlaufen willst. Allerdings wenn es erstmal am Schluss angekommen ist, dann ist es eben am Schluss angekommen.
Es könnte schon helfen vor den ganzen while-Schleifen 
	
	
	
	





```
rs.beforeFirst()
```
 aufzurufen, oder aber den Aufbau ändern


----------



## Extremefall (29. Mai 2011)

Ich erhalte bei deinem Vorschlag diesen Fehler:

```
Drina
Exception in thread "main" org.h2.jdbc.JdbcSQLException: Kann nicht an den Anfang der Resultat-Zeilen springen. Mögliche Lösung: conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ..).
The result set is not scrollable and can not be reset. You may need to use conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ..). [90128-155]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
	at org.h2.message.DbException.get(DbException.java:167)
	at org.h2.message.DbException.get(DbException.java:144)
	at org.h2.message.DbException.get(DbException.java:133)
	at org.h2.jdbc.JdbcResultSet.resetResult(JdbcResultSet.java:2995)
	at org.h2.jdbc.JdbcResultSet.beforeFirst(JdbcResultSet.java:2517)
	at DataBase.dbRequest(DataBase.java:38)
	at DataBase.main(DataBase.java:52)
```

Ich habe auch folgenden Code in der dbRequest Methode probiert:

```
ResultSet rs2 = rs;
```

Liegt es dann wohl an dem SQL Statement?


----------



## XHelp (29. Mai 2011)

Die Idee mag vlt verrückt klingen: aber warum nicht die Lösung versuchen, die vorgeschlagen wird?
Warum es zu der Fehlermeldung kommt steht in der API:


> A default ResultSet object is not updatable and has a cursor that moves forward only.


----------



## Extremefall (29. Mai 2011)

Danke, es klappt nun.


----------

