# Embedded Derby Datenbank



## damtre (16. Mai 2012)

Hey!

Ich versuche gerade die Derby Datenbank im Embedded Modus unter Eclipse zum laufen zu bekommen. Jedoch stoße ich sobald ich mit einem SELECT Statement auf die Tabelle zugreifen will auf eine Exception die ich einfach nicht loswerde.
Es handelt sich um die Exception Table/View 'Tabellenname' does not exist.

Infos zu meiner aktuellen Konfiguration:
Die Derby-Jar-Datei ist dem Projekt hinzugefügt und im JAVA buildpath eingepflegt.
Die Datenbank ist am laufen und ich kann ein SELECT Statement problemlos laufen lassen wenn ich es aus einem SQL-File direkt ausführe.
Das gleiche Statement aus JAVA heraus geht wiederrum nicht und es wird die o.g. Exception geworfen.

Hier mal mein Code:

```
private static final String driver = "org.apache.derby.jdbc.EmbeddedDriver";
private static final String url = "jdbc:derby:testDB;create=true";

...
public void actionPerformed(ActionEvent e) {
				Connection con = null;
				Statement st;
				ResultSet rs;

				try {
					Class.forName(driver);
					con = DriverManager.getConnection(url);

					// Use the database connection somehow.
					st = con.createStatement();
					rs = st.executeQuery("SELECT * FROM PUNKTELISTE"));
					if (rs == null) {
						System.out.println("LEER");
					} else {

						while (rs.next()) {
							System.out.println(rs.getObject(1) + " "
									+ rs.getObject(2));
						}
					}
				} catch (SQLException se) {
					se.printStackTrace();
				} catch (ClassNotFoundException ew) {
					System.out.println("JDBC Driver " + driver
							+ " not found in CLASSPATH");
				} finally {
					if (con != null) {
						try {
							con.close();
						} catch (SQLException se) {
							se.printStackTrace();
						}
					}
				}
			}
		});
```

Die Exception hier nochmal:


```
Caused by: java.sql.SQLException: Table/View 'PUNKTELISTE' does not exist.
	at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
	... 45 more
Caused by: ERROR 42X05: Table/View 'PUNKTELISTE' does not exist.
	at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
	at org.apache.derby.impl.sql.compile.FromBaseTable.bindTableDescriptor(Unknown Source)
	at org.apache.derby.impl.sql.compile.FromBaseTable.bindNonVTITables(Unknown Source)
	at org.apache.derby.impl.sql.compile.FromList.bindTables(Unknown Source)
	at org.apache.derby.impl.sql.compile.SelectNode.bindNonVTITables(Unknown Source)
	at org.apache.derby.impl.sql.compile.DMLStatementNode.bindTables(Unknown Source)
	at org.apache.derby.impl.sql.compile.DMLStatementNode.bind(Unknown Source)
	at org.apache.derby.impl.sql.compile.CursorNode.bindStatement(Unknown Source)
	at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
	at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
	at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source)
	... 39 more
```


Ich habe auch schon ein 

```
rs = st.executeQuery("SELECT * FROM APP.PUNKTELISTE"));
```
versucht, da APP ja das standard Schema ist, das verwendet wird, aber das bringt auch nichts.

Hoffe jemand hatte schon mal ein ähnliches Problem. Mir ist einfach nicht klar was das Problem ist...
Danke


----------



## tfa (16. Mai 2012)

> Die Datenbank ist am laufen und ich kann ein SELECT Statement problemlos laufen lassen wenn ich es aus einem SQL-File direkt ausführe.


Was bedeutet das? Du verwendest Derby im embedded-Modus. Was heißt, du führst "ein SQL-File direkt aus"? Läuft die DB doch im Server-Modus? Als embedded ist die Datenbank ja zunächst einmal leer. Da funktioniert noch kein select.


----------



## damtre (16. Mai 2012)

Mit embedded meine ich, dass ich meine Datenbank so verwenden will, dass diese Standalone in meiner Anwendung in Zukunft, wenn ich sie als JAR verpackt habe, läuft, ohne dass der User extra ne Datenbank zu installieren hat.

Zum SQL-File:
Ich erzeuge mir eine Datenbank, ganz normal über das Database Development Plugin, dass ich mir zuvor in Eclipse aus dem Indigo Repository heruas installiert habe. Dabei gebe ich auch an, dass die erzeugte Datenbank den Embedded Derby JDBC Driver verwenden soll.

Nach der Erzeugung der DB steht diese ab sofort in meinem Workspace im aktuellen Verzeichnis meines Programms zur Verfügung.
Nun erzeugte ich mir ein SQL-File (Rechtsklick im Package Explorer -> New -> Other -> SQL Development -> SQL File)
In diese SQL File kommen nun meine CREATE TABLE, INSERT INTO und ein SELECT Statement.
Nun kann ich mit einem rechtsklick auf das SQL File auf Execute SQL File klicken. Die Datei wird abgearbeitet und die Tabelle wird in meine Datenbank geschrieben, die Daten werden in die Tabelle eingefügt und das Select wird ausgeführt.

Also ist meine Datenbank nun mit einer Tabelle bestückt und beinhaltet auch Daten. 
Nun will ich aus meinem Programm wie oben beschrieben, einfach nur noch ein einfaches Select Statement auf diese gerade angelegte Datenbank ausführen, aber stattdessen kommt der o.g. Fehler.

Ich hoffe, meine Ausführungen sind nun besser nachzuvollziehen.

Grüße


----------



## turtle (16. Mai 2012)

Ich würde den Versuch eine DB zu erzeugen, mal weglassen

```
url = "jdbc:derby:testDB";
```

Weiterhin kannst Du die Zeile

```
Class.forName(driver);
```
ebenfalls weglassen.

Und dann prüfe mal, ob die DB geöffnet werden kann. Ich vermute, dass eine DB jedesmal neu erstellt wurde, wo auch immer, und darin natürlich noch keine Tabellen angelegt wurden. Mit dem Weglassen von "create=true" bist Du dir dann sicher, das die vorbereitete DB geöffnet wird.


----------



## damtre (16. Mai 2012)

Hey,

danke für die Antwort, allerdings brachte das nicht den erhofften erfolg.
Mittlerweile habe ich es geschafft Zugriff auf die Datenbanktabelle zu erhalten.
Ich habe alles gelassen wie es bisher war mit dem Unterschied, dass ich meine Tabelle in der Datenbank nicht mit Hilfe meines SQL-Files erzeuge sondern das Statement direkt aus meinem Java Programm heraus aufrufe.
Und siehe da schon hatte ich Zugriff auf meine Embedded DB.

Ich war bisher nur die Client-Server DB gewöhnt und dachte, dass es mit der Embedded Version genauso geht und ich nur die dbURL anpassen muss damit auch der Embedded JDBC Treiber verwendet wird, aber dem war nicht so.
Die Datenbank wird nun wie gehabt aus meinem JAVA-Programm erstellt:

```
private static final String url = "jdbc:derby:TestDB;create=true";
```

und die Tabelle einfach mit einem Statement hinzugefügt:


```
Statement st = null;
ResultSet rs = null;

try {
	Class.forName(driver);
	con = DriverManager.getConnection(url);
	st = con.createStatement();
	st.execute("CREATE TABLE PUNKTELISTE (NAME VARCHAR(50), Punkte INTEGER)");
st.executeUpdate("INSERT INTO punkteliste (Name, Punkte) Values ('Hugo', 1234)");
	rs = st.executeQuery("SELECT * FROM PUNKTELISTE");
...
}catch(...){
...
}
```

Nun wird beim Select auch endlich der Wert angezeigt...
Also so viel dazu. Man lernt nie aus.


----------

