2010-12-18 21 views
2

jetzt habe ich Probleme mit der Verbindung zu meiner Datenbank. Ich weiß, dass die Tabellen, nach denen ich suche, existieren, denn wenn ich mit der Befehlszeile auf sie zugreife, können sie abgefragt werden.SQLException: keine solche Tabelle

Wahrscheinlich einige kleine Aufsicht, aber ich würde etwas Hilfe lieben.

Hier stelle ich meine Verbindung zu meiner Datenbank Paket 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 abfragen 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(); 
    } 
} 

und schließlich einen 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, die erste Prüfung bestanden und die zweite nicht mit ein ähnlicher Fehler wie der obige

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()); 
    } 
+0

Ich frage mich, ob der Pfad zur Datenbank nicht richtig eingestellt ist, aber dann fragte mich, ob das den ersten Unit-Test fehlgeschlagen hätte. – Bnjmn

+0

versuchen Sie 'DBNAME.singleTask' als eine Aufnahme sollte es funktionieren. –

+0

@ org.life.java das gleiche Problem :( – Bnjmn

Antwort

6

Ich stelle fest, dass sowohl in Ihrem Gerät zu testen und Ihren anderen Code, den Sie rund um den Tabellennamen zurück-Ticks verwenden. In der neuesten Version von sqlite ist das in Ordnung, aber in älteren Versionen wurde es nicht so gut behandelt, glaube ich. Können Sie versuchen, die Ticks um den Tabellennamen herum zu entfernen oder sie in reguläre Anführungszeichen anstatt in Back-Ticks umzuwandeln?

Wenn das nicht löst, würde ich überprüfen, um absolut sicher zu sein, dass Sie auf die richtige db-Datei verweisen. Wenn Sie einen Dateinamen angeben, der nicht existiert, erhalten Sie keinen Fehler, sondern erstellen dort einfach eine neue Datenbank. Ich bin mir nicht sicher, was das "aktuelle Verzeichnis" im Kontext Ihres App- oder Komponententests ist, aber seien Sie sicher, dass es darauf zeigt, wo Sie es vermuten. Um dies zu testen, können Sie den Namen der Datenbankdatei in foo.db ändern, den Komponententest ausführen und dann Ihren Computer nach foo.db durchsuchen, um festzustellen, wo er erstellt wurde. Dadurch erfahren Sie, von wo Ihre App aus arbeitet.

+1

Ich habe mit den Zitaten und Back-Ticks gespielt und das hat nicht geholfen. Ich werde noch mehr mit Pfaden rumspielen und euch auf dem Laufenden halten. Danke, dass Sie mich darüber informiert haben, dass keine Fehler bei einem gefälschten DB-Namen auftreten. – Bnjmn

+1

Es war schwierig zu entscheiden, wer das Kopfgeld hier gewinnen sollte, aber ich habe mich entschieden, es Marplesoft zu geben, weil ich am nächsten kam. Die Verwendung eines vollständig qualifizierten Pfades für meine Datenbank endete mit dem Trick und diese Antwort veranlasste mich, eine Untersuchung der Details des Pfades einzuleiten, wodurch die Punkte vergeben wurden. Danke an alle für Ihre Beiträge. – Bnjmn

1

Ich bin mir nicht sicher, ob Ihre JDBC-Verbindungszeichenfolge richtig ist. Die verwendete Verbindungszeichenfolge endet mit taskMan.db, aber Ihr Kommentar oben bedeutet, dass der Name der Datenbankdatei taskManDb.db ist (beachten Sie die zusätzlichen Db).

+0

meine DB heißt taskManDb.db – Bnjmn

+1

In diesem Fall sollte Ihre Verbindungszeichenfolge 'jdbc: sqlite: src/database/taskManDb.db' sein, nicht' jdbc: sqlite: src/database/taskMan.db' –

+0

Litytestdata thanks for dieser Kommentar. Ich habe die Änderungen vorgenommen, aber leider hat das das Problem nicht gelöst. Ich habe diesen Fehler selbst auch gleich nach dem Posten bemerkt, froh, dass du ihn auch gesehen hast. – Bnjmn

1

Es kann nicht Ihr Problem mit der SQL-INSERT beheben, aber es ist mir egal für Ihre DBRegistry-Implementierung. Ich würde es so schreiben:

package persistence; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 


public class DBRegistry 
{ 
    public static Connection getConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException 
    { 
     Class.forName(driver); 
     return DriverManager.getConnection(url, username, password); 
    } 

    public static void close(Connection connection) 
    { 
     try 
     { 
      if (connection != null) 
      { 
       connection.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 


    public static void close(Statement statement) 
    { 
     try 
     { 
      if (statement != null) 
      { 
       statement.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void close(ResultSet resultSet) 
    { 
     try 
     { 
      if (resultSet != null) 
      { 
       resultSet.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Leider hat Ihre Lösung das Problem nicht gelöst und deshalb werde ich mein Kopfgeld als Belohnung ausgeben, aber ich möchte Ihnen dafür danken, dass Sie die Struktur der DBRegistry kommentiert haben und ich werde Ihre Lösung dort sicherlich implementieren. Ihre Version ist sinnvoller als meine und ich kann Ihnen nicht genug dafür danken, dass Sie sich die Zeit genommen haben, meinen Code zu überarbeiten. – Bnjmn

+0

Wie ich am Anfang sagte, habe ich nicht versucht, Ihr Problem zu lösen. Ich habe SQL Lite nicht auf meinem Computer installiert, daher kann ich es nicht versuchen. Aber ich werde. – duffymo

+0

danke für Ihre Unterstützung, ich schätze es wirklich. – Bnjmn

0

Vielleicht ist Ihr Tisch in einem Paket. so dass Sie vielleicht zu tun haben so etwas wie

select * from Tasks.ComplextTask 

(‚Aufgaben‘ ist das Paket)

+0

@ user521180 danke für diese Antwort, aber leider ist Tasks nicht in einem Paket. Ich schätze deine Bemühungen jedoch. – Bnjmn

0

Jetzt nur noch versuchen, eine Datei mit dem gleichen Namen in c zu finden: \ Windows \ System32 und Sie werden es finden. Es sagt uns, dass dein Weg nicht korrekt ist. Einen schönen Tag noch;

0

Bitte bestätigen Sie Ihre Verbindung nach der erstellten Tabelle und nach dem Einfügen.

Verwandte Themen