HSQLDB HSQLDB lässt mich nicht auf erstellte Tabelle zugreifen

Felix

Bekanntes Mitglied
Hallo,

in meinem Programm erstelle ich zuerst mal eine Tabelle in einer HSQL-Datenbank:

Java:
statement.execute("CREATE TABLE Vocables (index CHARACTER VARYING(12) NOT NULL PRIMARY KEY, germanimport CHARACTER VARYING(500) NOT NULL, foreignimport CHARACTER VARYING(500) NOT NULL, box SMALLINT DEFAULT 0, knowngf NUMERIC NOT NULL, unknowngf NUMERIC NOT NULL, knownfg NUMERIC NOT NULL, unknownfg NUMERIC NOT NULL, apposition TIMESTAMP DEFAULT LOCALTIMESTAMP, lastinterrogation TIMESTAMP);");

Das funktioniert auch super. Dann möchte ich Daten einfügen:

Java:
statement.executeUpdate("INSERT INTO \"Vocables\" (index, germanimport, foreignimport) VALUES ('" + index + "', '" + german + "', '" + foreign + "');");

Da kommt dann aber die Fehlermeldung:
Java:
java.sql.SQLException: user lacks privilege or object not found: Vocables
Wenn ich die Datenbank aber mit dem DatabaseManagerSwing, der bei der HSQLDB mitkommt, durchschaue, finde ich die Datenbank.

Ich verbinde mich mit der DB mit dem folgenden Code:
Java:
connection = DriverManager.getConnection("jdbc:hsqldb:file:/home/felix/voktrainer/db/VocablesDB;shutdown=true","SA","");

Ich versteh einfach nicht, wo das Problem liegt. Wäre nett, wenn ihr mir weiterhelfen könntet.

Grüße
Felix
 
M

Marcinek

Gast
Hallo,

das einzige, was ich mir grob vorstellen kann ist, dass deine Datenbank das erstellen der Tabelle in eine Transaktion packt.

Dein nächster aufruf erzeugt eine neue Transaktion und kann (ohne dirty read) nicht auf die Tabelle zugreifen.

Eventuell hat die Tabelle auch keinen korrekten owner, oder SA ist nicht berechtigt auf der Datenbank zu lesen.

Gruß,

Martin
 

Felix

Bekanntes Mitglied
Hallo,
danke erstmal für die Antworten und sorry, dass ich so lange auf mich warten ließ.
Also das schließen der Verbindung und des Statements (muss man Statements schließen?) bewirkt nichts.
Was mir allerdings jetzt aufgefallen ist, ist dass auch das DatabaseManagerSwing-Tool die Datenbank direkt nach dem erstellen nicht öffnen kann. Die Files, die die Datenbank bilden sind allerdings erstellt (geschieht ja automatisch). Das DatabaseManagerSwing gibt beim Versuch des Öffnens direkt nach dem Erstellen der Datenbank und der Tabelle durch mein Programm (Programm ist noch geöffnet) folgenden Fehler zurück:

Java:
java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.LockFile@bb1c56bd[file = /home/felix/voktrainer/db/VocablesDB.lck, exsists=true, locked=false,valid=false, ] method: checkHeartbeat read: 2010-07-14 09:35:57 heartbeat - read: -8782ms.

Wenn das Programm geschlossen ist, kann das Tool die Datenbank (und die darin erstelle Tabelle) öffnen.
 

BumBel

Mitglied
Ich hab das mal bei mir nachgebaut. Und ohne die Verbindung zu schließen hatte ich den selben Fehler. Als ich dann mal versucht hab die Verbindung zu schliessen und danach wieder ne neue zu öffnen und ein neues Statement erzeugt habe, gings.
Edit: Zu deinem Fehler, man kann nur einmal gleichzeitig auf die Datenbank zugreifen, der Fehler ist also normal.
 

Felix

Bekanntes Mitglied
Könntest du deinen Code mal online stellen? Vllt fällt mir ja beim Lesen deines Codes mein Fehler auf...
Danke schonmal!

EDIT:
Es erscheint die selbe Fehlermeldung, auch wenn ich die Tabelle und Datenbank vorher nicht erst erstellt habe, sondern diese von einem der vorherigen Testläufe des Programms noch bestehen.

EDITEDIT:
Ich habe jetzt lediglich den Namen der Tabelle von "Vocables" auf "VOCABLES" geändert, und es erscheint eine andere Fehlermeldung:
Java:
java.sql.SQLException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10030 table: VOCABLES
        at org.hsqldb.jdbc.Util.sqlException(Util.java:200)
        at org.hsqldb.jdbc.JDBCStatement.fetchResult(JDBCStatement.java:1805)
        at org.hsqldb.jdbc.JDBCStatement.executeUpdate(JDBCStatement.java:206)
 
Zuletzt bearbeitet:

BumBel

Mitglied
Java:
Connection con = DriverManager.getConnection("jdbc:hsqldb:file:Z:/Datenbank/neu;shutdown=true", "SA", "");
PreparedStatement st = con.prepareStatement("CREATE TABLE Vocables (index INTEGER PRIMARY KEY, germanimport VARCHAR(500) NOT NULL, foreignimport VARCHAR(500) NOT NULL, box SMALLINT DEFAULT 0, knowngf NUMERIC, unknowngf NUMERIC, knownfg NUMERIC, unknownfg NUMERIC, apposition TIMESTAMP DEFAULT LOCALTIMESTAMP, lastinterrogation TIMESTAMP)");
st.execute();
st.close();
st = con.prepareStatement("INSERT INTO Vocables (index, germanimport, foreignimport) VALUES (?, ?, ?)");
st.setInt(1, 1);
st.setString(2, german);
st.setString(3, foreign);');");
st.executeUpdate();
st.close();
st = con.prepareStatement("SHUTDOWN");
st.execute();

So geht es jetzt bei mir. Hab noch n paar Sachen anders gemacht wie du, die nix an der Funktionalität ändern sollten:
- Hab ein PreparedStatement benutzt
- Hab als index n Integer genommen
- Und hab VARCHAR genommen
Was wichtig ist, ich hab bei den meisten Spalten das NOT NULL rausgenommen da du bei der Erstellung der Datenbank sagst dass diese Spalten NOT NULL sein dürfen, aber beim INSERT die Spalten sozusagen leerlässt, dadurch tritt auch der
Code:
NOT NULL check constraint;
Fehler auf.

Hoffe jetzt geht bei dir dann alles:)
 

Felix

Bekanntes Mitglied
Uff, ich hab den Fehler endlich gefunden. Ich hatte bei den SQL-Befehl INSERT INTO Vocables das Vocables in Anführungszeichen gesetzt. Als ich die gelöscht hatte, hat es funktioniert. Bei PostgreSQL hat es allerdings auch mit den Anführungszeichen geklappt. Warum ist denn sowas nicht genormt??
Vielen Dank, ohne deinen Code wäre ich da vermutlich nie drauf gekommen.

Eine Frage hätte ich jetzt trotzdem noch. Ich möchte die Tabelle ja nur erstellen, wenn sie nicht schon besteht. Deshalb habe ich den Befehl zum erstellen in eine if-Anweisung eingebaut. Der Code sieht so aus:
Java:
ResultSet rs = connection.getMetaData().getTables(null, null, table, null);
            if (!rs.next()) {
                statement.execute("CREATE TABLE " + table + " (index CHARACTER VARYING(12) NOT NULL PRIMARY KEY, germanimport CHARACTER VARYING(500) NOT NULL, foreignimport CHARACTER VARYING(500) NOT NULL, box SMALLINT DEFAULT 0, knowngf NUMERIC, unknowngf NUMERIC, knownfg NUMERIC, unknownfg NUMERIC, apposition TIMESTAMP DEFAULT LOCALTIMESTAMP, lastinterrogation TIMESTAMP);");
                statement.close();

                //DEBUG
                System.out.println("Tabelle " + table + " angelegt...");
            }

Der Code funktioniert allerdings nicht, weil immer versucht wird die Tabelle zu erstellen. Warum das denn?
 

BumBel

Mitglied
Java:
pfad = "jdbc:hsqldb:file:"+ System.getenv("ProgramFiles") +"\\DatenbankJAVA\\Adressbuch";
Connection con = null;
try {	
	con = DriverManager.getConnection(pfad);
	PreparedStatement pstmt = con.prepareStatement("SELECT * FROM ADRESSE");
	pstmt.execute();
	
	return con;
} catch (Exception e) {
	try {
		PreparedStatement pstmt = con.prepareStatement("CREATE MEMORY TABLE PUBLIC.ADRESSE(PERSONID INTEGER PRIMARY KEY," +
				"VORNAME VARCHAR(50),NACHNAME VARCHAR(50),STRASSE VARCHAR(50), PLZ VARCHAR(7)," +
				"ORT VARCHAR(50),TELEFON VARCHAR(50),HANDY VARCHAR(50),EMAIL VARCHAR(50),GEB VARCHAR(50),SONSTIGES VARCHAR(50))");
		pstmt.execute();
	} catch (SQLException e1) {
		
	}
	
}

Ich hab das bei einer Übungsaufgabe mal so gelöst. Erst einen SELECT Befehl ausgeführt, der falls die Tabelle noch nicht da ist in s catch springt und dort dann die Tabelle erzeugt. Hoff das kann dir helfen.

So noch n schönes Wochenende!
 

mvitz

Top Contributor
Bin mir jetzt nicht zu 100% sicher, obs SQL Standard ist, aber wie wäre es mit:

Java:
statement.execute("CREATE TABLE IF NOT EXISTS" + table + " (index CHARACTER VARYING(12) NOT NULL PRIMARY KEY, germanimport CHARACTER VARYING(500) NOT NULL, foreignimport CHARACTER VARYING(500) NOT NULL, box SMALLINT DEFAULT 0, knowngf NUMERIC, unknowngf NUMERIC, knownfg NUMERIC, unknownfg NUMERIC, apposition TIMESTAMP DEFAULT LOCALTIMESTAMP, lastinterrogation TIMESTAMP);");
 

Felix

Bekanntes Mitglied
Das hab ich auch schon im Internet gelesen, aber es scheint iwie nicht zu funktionieren. Es entsteht immer eine Exception:
Java:
java.sql.SQLException: unexpected token: NOT required: (
        at org.hsqldb.jdbc.Util.sqlException(Util.java:200)
        at org.hsqldb.jdbc.JDBCStatement.fetchResult(JDBCStatement.java:1805)
        at org.hsqldb.jdbc.JDBCStatement.execute(JDBCStatement.java:635)
        at voktrainer03.database.DBConnector.connect(DBConnector.java:27)
        at voktrainer03.Main.<init>(Main.java:49)
        at voktrainer03.Main.main(Main.java:31)
Caused by: org.hsqldb.HsqlException: unexpected token: NOT required: (
        at org.hsqldb.error.Error.parseError(Error.java:151)
        at org.hsqldb.ParserBase.unexpectedTokenRequire(ParserBase.java:765)
        at org.hsqldb.ParserBase.readThis(ParserBase.java:434)
        at org.hsqldb.ParserDDL.compileCreateTableBody(ParserDDL.java:1084)
        at org.hsqldb.ParserDDL.compileCreateTable(ParserDDL.java:1071)
        at org.hsqldb.ParserDDL.compileCreate(ParserDDL.java:150)
        at org.hsqldb.ParserCommand.compilePart(ParserCommand.java:205)
        at org.hsqldb.ParserCommand.compileStatements(ParserCommand.java:88)
        at org.hsqldb.Session.executeDirectStatement(Session.java:1133)
        at org.hsqldb.Session.execute(Session.java:939)
        at org.hsqldb.jdbc.JDBCStatement.fetchResult(JDBCStatement.java:1797)
        ... 4 more
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I HSQLDB HSQLDB 2.5.0 - Wie Loggen abstellen? Datenbankprogrammierung 4
B HSQLDB - auto_increment als unexpected token ? Datenbankprogrammierung 1
E Abfrage auf HSQLDB Datenbankprogrammierung 4
windl MySQL und HSQLDB Datenbankprogrammierung 4
D HSQLDB HSQLDB in PHP-Projekt einbinden? Datenbankprogrammierung 7
I Inhalt einer hsqldb anzeigen Datenbankprogrammierung 1
G java.lang.ClassNotFoundException: org.hsqldb.jdbcDriver Datenbankprogrammierung 4
M HSQLDB oder DERBY - warum SCRIPT Datei? Datenbankprogrammierung 0
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F hsqldb Fehler - unknown source Datenbankprogrammierung 11
E HSQLDB Eclipse + Geronimo + HSQLDB = org.hsqldb.jdbcDriver in classloader Datenbankprogrammierung 5
M HSQLDB 2.0 - wie tmp-Verzeichnis löschen Datenbankprogrammierung 2
S HSQLDB DELETE-Statement funktioniert nicht Datenbankprogrammierung 4
M Bei HSQLDB etwas wie OPTIMIZE TABLE? Datenbankprogrammierung 2
D datenbank (hsqldb) in runnable jar einbinden Datenbankprogrammierung 2
E Herangehensweise Neues Projekt mit Netbeans / HSQLDB / JPA Datenbankprogrammierung 3
T Hsqldb: java.lang.NoClassDefFoundError: org/hsqldb/Server Datenbankprogrammierung 2
F Kann keine Verbindung mit HSQLDB aufbauen Datenbankprogrammierung 2
S HSQLDB Kopiere Tabellen Datenbankprogrammierung 2
H hsqldb - Database must be shutdown Datenbankprogrammierung 10
O HSQLDB Verbindung schlägt fehl Datenbankprogrammierung 3
K Jpa hsqldb Datenbankprogrammierung 1
N Problem mit HSQLDB Datenbankprogrammierung 5
N Hsqldb und text tables source not found Datenbankprogrammierung 5
B HSQLDB Datenbank Manager Datenbankprogrammierung 19
R SELECT aus hsqldb mit Parameter Datenbankprogrammierung 2
R HSQLDB Datenbankprogrammierung 10
G hsqldb datenspeicherung Datenbankprogrammierung 2
D H2 DB oder doch HSQLDB ? Datenbankprogrammierung 2
A HSQLDB Performance bei erstem Zugriff Datenbankprogrammierung 6
G HSQLDB überprüfen, ob Tabelle bereits existiert Datenbankprogrammierung 3
@ HSQLDB: socket creation error Datenbankprogrammierung 6
G HSQLDB Files Datenbankprogrammierung 5
G maximale Einträge in HSQLDB Datenbankprogrammierung 7
A Datenspeicherung in hsqldb Datenbankprogrammierung 22
A Umgang mit hsqldb Datenbankprogrammierung 24
A Fehler in der HSQLDB Datenbankprogrammierung 6
A Problem mit der Anbindung zur hsqldb Datenbankprogrammierung 18
J HSQLDB ohne JDBC Datenbankprogrammierung 8
C Keine Verbindung zu HSQLDB möglich Datenbankprogrammierung 22
G Probleme mit Laden des JDBC-Treiber in HSQLDB Datenbankprogrammierung 2
G HSQLDB - kann mir jemand Packages erstellen? Datenbankprogrammierung 6
B HSQLDB und die log-Datei Datenbankprogrammierung 10
W HSQLDB Datenbankprogrammierung 6
G HSQLDB als Dateien anlegen Datenbankprogrammierung 5
S nullpointerexception bei HSQLDB Datenbankprogrammierung 4
L HSQLDB sichern (import und export von DB) Datenbankprogrammierung 3
D HSQLDB in JAR Datenbankprogrammierung 3
S hsqldb und ant Datenbankprogrammierung 3
S Hsqldb java.lang.NullPointerException Datenbankprogrammierung 2
D HSQLDB 2xPK + AutoInc Datenbankprogrammierung 22
M HSQLDB Server Problem Datenbankprogrammierung 2
T HSQLDB => diverses Datenbankprogrammierung 21
L persistentes Speichern von Daten in der HSQLDB ? Datenbankprogrammierung 5
A Weitere Fragen zu hsqldb Datenbankprogrammierung 6
A Text-Tabellen in HSQLDB Datenbankprogrammierung 9
A HSQLDB Datenbankprogrammierung 10
A Hsqldb ClassDefNotFound Datenbankprogrammierung 2
M Problem mit HSQLDB Datenbankprogrammierung 2
N Hibernate & hsqldb: Problem bei db-update Datenbankprogrammierung 7
G Problem mit der Startenzeit einer HSQLDB Datenbankprogrammierung 4
T HSQLDB, wie mache ich das mit hsqldb.cache_scale? Datenbankprogrammierung 13
E BufferedImage in hsqldb speichern Datenbankprogrammierung 5
B HSqlDb Datenbankprogrammierung 2
X HSQLDB und Variablen Datenbankprogrammierung 7
R hsqldb: performance, große tabellen und so Datenbankprogrammierung 10
P DERBY vs HSQLDB (Vor- Nachteile) Datenbankprogrammierung 3
EagleEye INSERT INTO Problem mit HSQLDB Datenbankprogrammierung 8
G Vector in hsqldb schreiben Datenbankprogrammierung 5
M Cast-Problem - HSQLDB Datenbankprogrammierung 3
C HSQLDB korrekter Shutdown Datenbankprogrammierung 2
C hsqldb Befehle in Java Datenbankprogrammierung 19
P HSQLDB Mehrbenutzerbetrieb Datenbankprogrammierung 7
D HSQLDB Datenbank Zugriff! Datenbankprogrammierung 4
H javaw bleibt bei hsqldb hängen Datenbankprogrammierung 12
D HSQLDB installieren ... Datenbankprogrammierung 8
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
A Java DB Server lässt sich nicht starten Datenbankprogrammierung 3
Davee SQLite SQLite Datenbank lässt sich nicht auf anderen PCs öffnen Datenbankprogrammierung 8
M Derby/JavaDB Neu geschriebener Eintrag per UPDATE lässt sich nicht unmittelbar abrufen Datenbankprogrammierung 2
G SQLException: Lässt sich der Fehler feststellen? Datenbankprogrammierung 10
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
N Wie kann ich mich mit Oracle verbinden? Datenbankprogrammierung 3
M irgendwie neu für mich --- Java & geliebtes SQL Datenbankprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben