# HSQLDB Verbindung schlägt fehl



## Onkel Hatti (16. Sep 2009)

Hallo Alle.

Ich benutze (möchte benutzen) eine HSQLDB (1.9) Datenbank.
Dazu benutze ich den Squirrel SQL Client und erstelle eine Datenbank.
Wenn das passiert ist, komt eine .script Datei heraus:


```
SET DATABASE UNIQUE NAME HSQLDB23C3C92AF9
SET DATABASE GC 0
SET DATABASE DEFAULT RESULT MEMORY ROWS 0
SET DATABASE EVENT LOG LEVEL 0
SET DATABASE SQL SIZE TRUE
SET DATABASE SQL NAMES FALSE
SET DATABASE TRANSACTION CONTROL LOCKS
SET FILES WRITE DELAY 10
SET FILES BACKUP INCREMENT TRUE
SET FILES CACHE SIZE 10000
SET FILES CACHE ROWS 50000
SET FILES SCALE 8
SET FILES DEFRAG 20
SET FILES NIO TRUE
SET FILES LOG SIZE 50
SET DATABASE TEXT TABLE DEFAULTS ''
SET DATABASE COLLATION "English"
CREATE USER SA PASSWORD ''
CREATE SCHEMA PUBLIC AUTHORIZATION DBA
SET SCHEMA PUBLIC
CREATE CACHED TABLE PUBLIC.MEDIUMA(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1138) NOT NULL PRIMARY KEY,IDENTNR BIGINT NOT NULL,TITEL VARCHAR(255) NOT NULL,ANZAHL INTEGER NOT NULL,CONSTRAINT SYS_UN_108 UNIQUE(IDENTNR))
ALTER TABLE PUBLIC.MEDIUMA ALTER COLUMN ID RESTART WITH 1138
CREATE CACHED TABLE PUBLIC.MEDIUMB(IDENTNR BIGINT NOT NULL PRIMARY KEY,ORIGINALTITEL VARCHAR(255),PREIS DECIMAL(5,2),KAUFDATUM DATE,SPIELLAENGE TIME,SEITENZAHL INTEGER,FOREIGN KEY(IDENTNR) REFERENCES PUBLIC.MEDIUMA(IDENTNR) ON DELETE CASCADE ON UPDATE CASCADE)
...
```

Ich versuche mich über Java mit der HSQL Datenbank zu verbinden:


```
...
		try
		{
			Class.forName("org.hsqldb.jdbcDriver");
		}
		catch (ClassNotFoundException c)
		{
			return false;
		}
		try
		{
			Connection dbConn = DriverManager.getConnection("jdbc:hsqldb:file:"+databasename, "sa", "");
		}
		catch (SQLException s)
		{
			JOptionPane.showMessageDialog(null, "Error connecting to DB", "Error", JOptionPane.ERROR_MESSAGE);
			return false;
		}
...
```

Das schlägt fehl mit einer SQLException:

java.sql.SQLException: error in script file line: 1 user lacks privilege or object not found: FILES
	at org.hsqldb.jdbc.Util.sqlException(Util.java:365)
	at org.hsqldb.jdbc.Util.sqlException(Util.java:103)
	at org.hsqldb.jdbc.JDBCConnection.<init>(JDBCConnection.java:3236)
	at org.hsqldb.jdbc.JDBCDriver.getConnection(JDBCDriver.java:285)
	at org.hsqldb.jdbc.JDBCDriver.connect(JDBCDriver.java:245)
	at org.hk.dbframe.database.DataBaseHSQLDB.createConnection(DataBaseHSQLDB.java:78)
	at org.hk.dbframe.gui.DBFrameStart.connectToDB(DBFrameStart.java:124)
	at org.hk.dbframe.gui.DBFrameStart.<init>(DBFrameStart.java:91)
	at org.hk.dbframe.gui.DBFrameStart.main(DBFrameStart.java:51)
Caused by: org.hsqldb.HsqlException: error in script file line: 1 user lacks privilege or object not found: FILES
	at org.hsqldb.Error.error(Error.java:111)
	at org.hsqldb.scriptio.ScriptReaderText.readDDL(ScriptReaderText.java:131)
	at org.hsqldb.scriptio.ScriptReaderBase.readAll(ScriptReaderBase.java:88)
	at org.hsqldb.persist.Log.processScript(Log.java:782)
	at org.hsqldb.persist.Log.open(Log.java:189)
	at org.hsqldb.persist.Logger.openLog(Logger.java:134)
	at org.hsqldb.Database.reopen(Database.java:314)
	at org.hsqldb.Database.open(Database.java:262)
	at org.hsqldb.DatabaseManager.getDatabase(DatabaseManager.java:222)
	at org.hsqldb.DatabaseManager.newSession(DatabaseManager.java:145)
	at org.hsqldb.jdbc.JDBCConnection.<init>(JDBCConnection.java:3219)

Erstelle ich jedoch in Java (gleicher Connect-Befehl) eine HSQLDB Datenbank, dann sieht die .script Datei anders aus:


```
SET DATABASE COLLATION "English"
CREATE USER SA PASSWORD ''
CREATE SCHEMA PUBLIC AUTHORIZATION DBA
SET SCHEMA PUBLIC
CREATE CACHED TABLE PUBLIC.MEDIUMA(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1138) NOT NULL PRIMARY KEY,IDENTNR BIGINT NOT NULL,TITEL VARCHAR(255) NOT NULL,ANZAHL INTEGER NOT NULL,CONSTRAINT SYS_UN_108 UNIQUE(IDENTNR))
ALTER TABLE PUBLIC.MEDIUMA ALTER COLUMN ID RESTART WITH 1138
CREATE CACHED TABLE PUBLIC.MEDIUMB(IDENTNR BIGINT NOT NULL PRIMARY KEY,ORIGINALTITEL VARCHAR(255),PREIS DECIMAL(5,2),KAUFDATUM DATE,SPIELLAENGE TIME,SEITENZAHL INTEGER,FOREIGN KEY(IDENTNR) REFERENCES PUBLIC.MEDIUMA(IDENTNR) ON DELETE CASCADE ON UPDATE CASCADE)
...
```

und die Anweisunge, die fehlen, stehen in der .properties Datei der Datenbank.

Jetzt die Frage:

Woran liegt es, daß ich mich mit der Datenbank nicht verbinden kann? Was mach ich falsch?
bzw. Squirrel kann sich mit der Datenbank problemlos verbinden. Was macht Squirrel anders?

Danke schon mal
 Hatti


----------



## Gelöschtes Mitglied 5909 (17. Sep 2009)

schlägt jetzt die verbindung fehl oder das script? sieht für mich eher aus als das skript?!?!?

und wieso versuchst du dieses skript auszuführen? das sind die anweisungen die hsql am anfang macht, 
um die "systemtabellen" anzulegen. Die musst du nicht ausführen.

nehm die connection und erstell damit deine eigenen tabellen


```
package de.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class HSQLDB {

    public static void main( String[] args ) throws Exception {
        Class.forName("org.hsqldb.jdbcDriver");
        Connection connection = DriverManager.getConnection("jdbc:hsqldb:file:foo", "sa", "");
        PreparedStatement statement = connection.prepareStatement("CREATE TABLE FOO(ID INTEGER, BAR VARCHAR)");
        statement.execute();
        
        for ( int i = 0; i < 10; i++ ) {
            statement = connection.prepareStatement("INSERT INTO FOO VALUES(?, ?)");
            statement.setInt(1, i);
            statement.setString(2, ""+i);
            statement.execute();
        }
        statement = connection.prepareStatement("SELECT * FROM FOO");
        ResultSet query = statement.executeQuery();
        while( query.next() ) {
            System.out.println(query.getInt(1) + query.getString(2));
        }
    }

}
```



> 00
> 11
> 22
> 33
> ...



und machs nicht so unsauber wie ichs jetzt zum testen gemacht hab!


----------



## Onkel Hatti (17. Sep 2009)

Ja, das Script. Aber nicht ich rufe das auf, sondern HDSQLD arbeitet das Script ab, wenn ich versuche, mich an der Datenbank mittels

    Connection connection = DriverManager.getConnection("jdbc:hsqldb:file:foo", "sa", "");

anzumelden. Warum auch immer. Ich kann das weder steuern noch verhindern. Und nicht ich scheitere somit an dem Eintrag (und damit an der Verbindung zur Datenbank), sondern HSQLDB.

Ich hab mir ein Java-Programm geschrieben, mit dem ich die Tabellen aus Java heraus erstelle und auch mit diversen Daten fülle. Das erstmal als Workaround. Das geht auch soweit gut.
Aber es gibt ja Programme wie Squirrel, die einem die Arbeit leichter machen. Und deshalb würde ich mich auch gerne an Datenbanken anmelden können, die von Squirrel erstellt worden sind. Das ist mit HSQLDB derzeit nicht möglich.

Hatti


----------



## stevetc (3. Nov 2009)

Hi,

ich hatte genau das gleiche Problem und ich habe es am Anfang auch nicht verstanden.
Die Lösung bei mir: Der JDBC-Treiber verschluckt bei der URL die Backslashes und findet so das Verzeichnis der angegeben Datenbankdatei "nicht" (verwendet man / dann funktioniert es).

Das gemeine an der Angelegenheit ist, dass, falls die Datenbankdatei noch nicht vorhanden ist, was bei einem falsch interpretierten Verzeichnis der Fall ist, einfach eine neue leere Datei angelegt und verwendet wird.
Ich habe also mit DbVisualizer eine Datenbank angelegt unter d:\temp\Demo und befüllt, sowie einen Benutzer angelegt.
Dann habe ich in meinem Java-Programm veruscht die Datenbank einzulesen mit:
jdbc:hsqldb:file:d:\temp\Demo

Jetzt macht der JDBC-Treiber jedoch daraus eine Datei dtempDemo und legt in dem aktuellen Projektverzeichnis eine neue Datenbankdatei mit diesem Namen an.
Klar, dass dann der Inhalt der eigentlichen bzw. der angelegte Benutzer nicht gefunden wird.
Mit:
jdbc:hsqldb:file:d:/temp/Demo 
war es kein Problem.

Ich habe damit nicht gerechnet, da in vielen Tutorials, ein Beispiel mit Backslash verwendet wird.

Ich hoffe der Fehler bleibt jetzt dem ein oder anderen erspart.


----------

