SQLException: no such table
nun habe ich einige Probleme mit der Verbindung zu meiner Datenbank. Ich kenne die Tabellen, die ich Suche, existieren, weil, wenn ich auf Sie zugreifen mit dem Befehl Linie, die Sie abgefragt werden können.
Wahrscheinlich einige kleinere Aufsicht, aber ich würde gerne etwas Hilfe.
Dies ist, wo ich meine Verbindung zu meiner Datenbank
package Persistenz;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
public class DBRegistry {
private static DBRegistry db = null;
private static Connection connection = null;
private DBRegistry() {};
public static synchronized DBRegistry getUniqueInstance() {
if (db == null) {
db = new DBRegistry();
return db;
}
else return db;
}
public synchronized Connection getDBConnection() {
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:src/database/taskMan.db");
return connection;
}
catch (SQLException e) {e.printStackTrace();}
catch (ClassNotFoundException e) {e.printStackTrace();}
return null;
}
public synchronized void closeConnection() {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Hier ist, wie ich Abfrage, es
public void create(UUID oid, Object obj) {
Task t = (Task)obj;
String statement = "INSERT INTO `complexTask` (`oid`,`description`,`status`) VALUES (?, ?, ?)";
try {
PreparedStatement dbStatement = db.prepareStatement(statement);
dbStatement.setString(1, oid.toString());
dbStatement.setString(2, t.getDescription());
dbStatement.setBoolean(3, t.getStatus());
dbStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
schließlich ein stack trace:
java.sql.SQLException: no such table: complexTask
at org.sqlite.DB.throwex(DB.java:288)
at org.sqlite.NativeDB.prepare(Native Method)
at org.sqlite.DB.prepare(DB.java:114)
at org.sqlite.PrepStmt.<init>(PrepStmt.java:37)
at org.sqlite.Conn.prepareStatement(Conn.java:231)
at org.sqlite.Conn.prepareStatement(Conn.java:224)
at org.sqlite.Conn.prepareStatement(Conn.java:213)
at persistence.framework.ComplexTaskRDBMapper.create(ComplexTaskRDBMapper.java:23)
at persistence.PersistanceFacade.create(PersistanceFacade.java:49)
at persistence.persistanceStates.NewState.commit(NewState.java:10)
at persistence.PersistentObject.commit(PersistentObject.java:23)
at domain.objects.Task.commitToDB(Task.java:89)
at domain.TaskRepository.commitToDB(TaskRepository.java:60)
at domain.TaskController.persistanceCommit(TaskController.java:97)
at presentation.TaskControlsJPanel$3.actionPerformed(TaskControlsJPanel.java:127)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253)
at java.awt.Component.processMouseEvent(Component.java:6175)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:5940)
at java.awt.Container.processEvent(Container.java:2105)
at java.awt.Component.dispatchEventImpl(Component.java:4536)
at java.awt.Container.dispatchEventImpl(Container.java:2163)
at java.awt.Component.dispatchEvent(Component.java:4362)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
at java.awt.Container.dispatchEventImpl(Container.java:2149)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4362)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
Und einige JUnit-code für eine gute Maßnahme, der erste test ist erfolgreich und der zweite schlägt mit einem ähnlichen Fehler zu dem oben genannten
package test.persistence;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import persistence.DBRegistry;
import junit.framework.TestCase;
public class TestDBRegistry extends TestCase {
public void testDBRegistryConnection() {
Connection con = DBRegistry.getUniqueInstance().getDBConnection();
assertNotNull(con);
}
public void testTableQuery() throws SQLException {
Connection con = DBRegistry.getUniqueInstance().getDBConnection();
PreparedStatement dbStatement = con.prepareStatement("SELECT COUNT(*) FROM `singleTask`");
assertEquals("should be 1 for successful query", 1, dbStatement.executeQuery());
}
Ich Frage mich, ob der Pfad zu der Datenbank nicht richtig eingestellt ist, aber dann gewundert, wenn das hätte th ersten unit test fehlschlagen.
versuchen
gleiche Problem 🙁
versuchen Sie, die gleiche DB mit einigen anderen front-end-überprüfen der Tabellen
Ich habe versucht die Befehlszeile verwenden, und es funktionierte! ben@ben-laptop:~/workspace/taskManager_v4/src/Datenbank$ sqlite taskManDb.db SQLite version 2.8.17 Enter ".help" for instructions sqlite> .Tabellen complexTask repeatingTask singleTask Teilaufgabe
versuchen
DBNAME.singleTask
als ein Schuss sollte es funktionieren .gleiche Problem 🙁
versuchen Sie, die gleiche DB mit einigen anderen front-end-überprüfen der Tabellen
Ich habe versucht die Befehlszeile verwenden, und es funktionierte! ben@ben-laptop:~/workspace/taskManager_v4/src/Datenbank$ sqlite taskManDb.db SQLite version 2.8.17 Enter ".help" for instructions sqlite> .Tabellen complexTask repeatingTask singleTask Teilaufgabe
InformationsquelleAutor Bnjmn | 2010-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich feststellen, dass sowohl Ihre unit-Tests und anderen code, den Sie verwenden back-ticks um den Tabellennamen. In der neuesten version von sqlite, das ist in Ordnung, aber in älteren Versionen war es nicht so gehandhabt, wie gut glaube ich. Können Sie versuchen, das entfernen der Zecken um den Tabellennamen oder vielleicht ändern Sie regelmäßig Zitate eher als back-ticks?
Wenn das nicht lösen, es würde ich prüfen, um absolut sicher zu sein, dass Sie auf der richtigen db-Datei. Wenn Sie einen Dateinamen angeben, der nicht existiert, den Sie nicht erhalten eine Fehlermeldung, es wird einfach eine neue Datenbank gibt. Ich bin mir nicht sicher, was das "aktuelle Verzeichnis" ist unter dem Kontext Ihres app-oder unit-test, aber sicher ist, zeigte auf, wo Sie denken, es ist. Um dies zu testen, könnten Sie ändern Sie die db-Datei-Namen, um
foo.db
führen die unit test, dann suchen Sie Ihre Maschine fürfoo.db
um zu sehen, wo wurde es erstellt. Das wird Ihnen sagen, wo die app läuft.Es war schwierig zu entscheiden, wer gewinnen sollte das Kopfgeld auf diesen einen, aber ich habe mich entschieden, es zu geben Marplesoft für die kommen die nächsten. Mit einem vollständig qualifizierten Pfad für meine Datenbank am Ende machen die trick-und diese Antwort veranlasste mich zu starten, eine Untersuchung über die details der Pfad, also die Punkte vergeben wurden. Vielen Dank an alle für Ihre Beiträge.
InformationsquelleAutor Marplesoft
Ich bin nicht sicher, ob die JDBC-Verbindung string ist ganz richtig. Die Verbindungszeichenfolge, die Sie verwenden, endet mit
taskMan.db
, aber dein Kommentar oben bedeutet, dass der name der Datenbank-Datei isttaskManDb.db
(beachten Sie die zusätzlicheDb
).In diesem Fall wird die Verbindungszeichenfolge sollte
jdbc:sqlite:src/database/taskManDb.db
, nichtjdbc:sqlite:src/database/taskMan.db
Litytestdata Dank für diesen Kommentar. Ich habe die änderungen gemacht aber leider das Problem nicht behoben. Ich tatsächlich gefangen, der Fehler ist mir auch gleich nach der Buchung froh, dass Sie sah es auch.
InformationsquelleAutor Luke Woodward
Könnte es nicht beheben Ihr problem mit der SQL-INSERT -, aber ich interessiere mich nicht für Ihre DBRegistry Umsetzung. Ich würde es schreiben wie dieses:
Wie ich am Anfang schon gesagt, ich habe nicht versucht, Ihr Problem zu lösen. Ich habe keine SQL-Lite auf meinem Rechner installiert, so kann ich nicht versuchen Sie es. Aber ich werde es.
vielen Dank für deine Unterstützung, ich wirklich zu schätzen.
InformationsquelleAutor duffymo
Vielleicht ist Ihr Tisch wird in einem Paket. so haben Sie vielleicht etwas tun, wie
('Aufgaben' als-Paket)
InformationsquelleAutor code511788465541441
Jetzt nur versuchen, zu finden eine Datei mit dem gleichen Namen in c:\windows\system32 und du wirst es finden. Es sagt uns, dass dein Weg nicht richtig ist. Habt einen schönen Tag;
InformationsquelleAutor Tiger
Bitte Committen Sie Ihre Verbindung erstellt nach Tabelle und nach einsetzen.
InformationsquelleAutor Durgesh Gupta