# hsqldb Fehler - unknown source



## ForenDaddy (28. Mrz 2011)

ich versuche jetzt seit stunden eine hsql datenbank zum laufen zu bringen.
sie soll einfach lokal auf dem rechner laufen.
nach dem durchforsten von einem dutzend tutorials, komme ich zu der erkenntnis, dass es jeder anders macht und ich anscheinend nicht richtig.

ich habe mich an dem tutorial von hsqldb.org orientiert:
Programming For Future: Using HyperSQL (HSQLDB)

aber irgendwas stimmt nicht. ich bekomme egal was ich mache, diese fehler:

```
java.sql.SQLException: unexpected token: (
        at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
        at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
        at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source)
        at fcp.Logic.FCP_System.dbVerbindungLokal(FCP_System.java:128)
        at fcp.Logic.FCP_System.main(FCP_System.java:58)
Caused by: org.hsqldb.HsqlException: unexpected token: (
        at org.hsqldb.error.Error.parseError(Unknown Source)
        at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
        at org.hsqldb.ParserDDL.compileCreateTableBody(Unknown Source)
        at org.hsqldb.ParserDDL.compileCreateTable(Unknown Source)
        at org.hsqldb.ParserDDL.compileCreate(Unknown Source)
        at org.hsqldb.ParserCommand.compilePart(Unknown Source)
        at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
        at org.hsqldb.Session.executeDirectStatement(Unknown Source)
        at org.hsqldb.Session.execute(Unknown Source)
        ... 4 more
```

ich bin die ganze anleitung schritt für schritt durchgegangen und habe nach möglichkeit nur die pfade geändert.
leider steht in der anleitung kaum information, was eigentlich was genau bedeutet.
daher bin ich jede mögliche kombination mal durchgegangen. aber die fehlermeldungen ändern sich einfach nicht.

hier mein code, für einen kleinen test, der leider noch nicht funktioniert:

```
package fcp.Logic;
import java.util.*;
import java.io.*;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class FCP_System {
    public static String dbURL = "C:\\Dokumente und Einstellungen\\user\\pap\\db\\hsqldb\\";


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

    /*
     * Stellt eine Verbindung zur lokalen Datenbank her.
     *
     * @return void
     */
    public static void dbVerbindungLokal() {
        Connection dbVerbindung = null;

        try {
            try {
                Class.forName("org.hsqldb.jdbcDriver").newInstance();
            } catch (InstantiationException ex) {
                Logger.getLogger(FCP_System.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(FCP_System.class.getName()).log(Level.SEVERE, null, ex);
            }

        } catch( ClassNotFoundException e ) {
            e.printStackTrace();
        }
        
        try {
            dbVerbindung = DriverManager.getConnection( "jdbc:hsqldb:dbURL", "sa", "" );
            Statement sqlbefehl = dbVerbindung.createStatement();
            sqlbefehl.executeUpdate( "CREATE TABLE Benutzer (FahrerNr integer(50),Vorname char(50),Nachname char(50),Passwort char(50)"
                                      + "PRIMARY KEY(FahrerNr)" );
            ResultSet result = sqlbefehl.executeQuery( "SELECT * FROM Benutzer" );
            while ( result.next() ) {
                System.out.println( result.getString(1) + " : " + result.getString(2) + " : " + result.getString(3) + " : " + result.getString(4) );
                result.close();
                sqlbefehl.close();
            }
        } catch( SQLException e ) {
            e.printStackTrace();
        } finally {
            if ( dbVerbindung != null ) {
                try {
                    dbVerbindung.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
```
Fehler werden in Zeile 13 und 40 angezeigt, verursacht durch eine hsqlException(Unknown Source).

Ich schätze, er findet die Datenbank nicht (Unknown Source).
Aber ich weiss nicht was am Code fehlt?
Ich denke auch ich habe die Anleitungen richtig befolgt. Leider sind die Anleitung auch gleichzeitig lückenhaft, so dass ich mir nicht sicher sein kann, ob die Rückmeldungen die ich erhalte richtig sind.


----------



## SlaterB (28. Mrz 2011)

meine Güte, auf Zeile 40 bist du schon gekommen mit einer immer verdächtigen Datenbankabfrage,
[c]sqlbefehl.executeUpdate( "gfskglkj");[/c]
würde schließlich auch kompilieren und erst zur Laufzeit eine Fehlermeldung geben,

dann hast die Info 'unexpected token: (', was dir selbst bei kompletter Unkenntnis doch wenigstens sagen sollte 'wie sieht es eigentlich mit Klammern aus?',
wiederum in der SQL-Query, nicht im Java-Code, sonst würde das ganze ja überhaupt nicht kompilieren

reicht diese Verdeutlichung der Offensichtlichkeiten nun doch, selber nachzuschauen und den Fehler im SQL zu finden?
ansonsten für weitere Tipps zur Strafe mindestens bis morgen warten 

> Ich schätze, er findet die Datenbank nicht (Unknown Source).

Unknown Source heißt, dass nicht die genaue Zeilennummer im Java-Code z.B. der Klasse org.hsqldb.error.Error mit Methode parseError() angegeben werden kann,
bei deinen Klassen ist für StackTrace-Einträge dagegen die Zeilennummer angegeben,
ist normal für fremde Libraries wie den DB-Treiber, Zeilennummer dort nicht wichtig


----------



## fastjack (29. Mrz 2011)

Dein Create-Query ist einfach murks. Sieh mal hier:

Chapter 9. SQL Syntax


----------



## ForenDaddy (29. Mrz 2011)

habs gefunden.
wie erwartet, hat die angabe des datenbankpfades nicht gestimmt.
natürlich so blöd von mir geschrieben, dass ich es ständig überlesen habe.

anstatt:

```
public static String dbURL = "C:\\Dokumente und Einstellungen\\user\\pap\\db\\hsqldb\\";
```
und

```
dbVerbindung = DriverManager.getConnection( "jdbc:hsqldb:dbURL", "sa", "" );
```

muss es heissen:

```
public static String dbURL = "jdbc:hsqldb:file:C:\\Dokumente und Einstellungen\\user\\pap\\db\\hsqldb\\;shutdown:true";
```
und

```
dbVerbindung = DriverManager.getConnection( dbURL, "sa", "" );
```
da waren die "" bei dbVerbindung einfach zu viel.
das shutdown=true sorgt dafür, dass die datenbank persistent bleibt, die daten also nicht verloren gehen beim nächsten starten.

DANACH wird es erst relevant ob die queries stimmen.
Aber dazu kam ich vorher ja erst gar nicht.

ERLEDIGT.


----------



## SlaterB (29. Mrz 2011)

komplett so ist das ein bisschem im Wiederspruch zur Fehlermeldung mit StackTrace 'org.hsqldb.ParserDDL.compileCreateTable'
also durchaus schon mit der konkreten Verarbeitung des CREATE TABLE-SQL beschäftigt

aber bei gelösten Themen soll man nicht meckern, ich setze auch die Markierung 'Erledigt'


----------



## fastjack (29. Mrz 2011)

Der Stacktrace gibt es ja auch an:


```
org.hsqldb.jdbc.JDBCStatement.executeUpdate
```

also Query falsch. 

--> 


```
at org.hsqldb.error.Error.parseError(Unknown Source)
        at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
        at org.hsqldb.ParserDDL.compileCreateTableBody(Unknown Source)
        at org.hsqldb.ParserDDL.compileCreateTable(Unknown Source)
        at org.hsqldb.ParserDDL.compileCreate(Unknown Source)
```


```
dbVerbindung = DriverManager.getConnection( "jdbc:hsqldb:dbURL", "sa", "" );
```

funktioniert auch, nur das eine DB namens "dbURL" erzeugt wird, und zwar im Speicher und nicht im Dateisystem.


----------



## ForenDaddy (29. Mrz 2011)

das query mag ein problem gewesen sein, aber es war das kleinste.
nach dem ich die queries korrigierte hatte lief immer noch nichts.
somit sind sie nicht die eigentliche wurzel des übels gewesen.
nach dem ich dann den fehler gefunden hatte, habe ich noch einmal query fehler eingebaut.
dann werden die fehlermeldungen sehr viel eindeutiger und lassen sich schnell beheben.
aber vorher ging halt gar nichts.

@fastjack
deshalb habe ich auch die korrektur auf :file: gemacht

```
public static String dbURL = "jdbc:hsqldb:file:C:\\Dokumente und Einstellungen\\user\\pap\\db\\hsqldb;shutdown:true";
```
jetzt heisst die datenbank hsqldb. total erfindungsreich


----------



## SlaterB (29. Mrz 2011)

ist das Thema beendet? die Markierung 'Erledigt' wurde wieder entfernt, fälschlicherweise?


----------



## fastjack (29. Mrz 2011)

> jetzt heisst die datenbank hsqldb.



das ist die normale funktionsweise von HSQL.


----------



## ForenDaddy (29. Mrz 2011)

der dateiname ist jetzt hsqldb.
ich hätte auch:

```
public static String dbURL = "jdbc:hsqldb:file:C:\\Dokumente und Einstellungen\\user\\pap\\db\\hsqldrucktgeld;shutdown:true";
```
nennen können. dann würde die datei der datenbank "hsqldrucktgeld" heissen.
was ja nicht wirklich die funktionsweise von hsql ist :lol:


----------



## fastjack (29. Mrz 2011)

> was ja nicht wirklich die funktionsweise von hsql ist



eben doch, der letzte Teil Deines Pfades ist der Datenbankname.

Chapter 1. Running and Using Hsqldb


----------



## ForenDaddy (29. Mrz 2011)

sag ich ja, ist der datenbankname.
ein name hat mit der funktion aber nichts zu tun.
ansonsten hätte mein beispiel die funktion, dass sie geld druckt.


----------

