2010-12-18 110 views
2

現在我連接到我的數據庫時遇到了一些麻煩。我知道我正在尋找的表格存在,因爲當我使用命令行訪問它們時,可以查詢它們。SQLException:沒有這樣的表

大概是一些小小的疏忽,但我會喜歡一些幫助。

這是我連接到我的數據庫的地方 包持久性;

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

這是我如何查詢它

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

最後一個堆棧跟蹤:

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) 

和良好的措施一些JUnit的代碼,第一個測試通過,並且第二失敗與上述類似的錯誤

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

我想知道如果數據庫的路徑設置不正確,但然後想知道是否會使第一次單元測試失敗。 – Bnjmn 2010-12-18 12:26:44

+0

嘗試'DBNAME.singleTask'作爲它應該工作的鏡頭。 – 2010-12-18 12:37:26

+0

@ org.life.java同樣的問題:( – Bnjmn 2010-12-18 12:43:39

回答

6

我注意到,在你的單元測試和你的其他代碼中,你正在使用圍繞表名稱的back-ticks。在最新版本的sqlite中,這很好,但在舊版本中,它不被處理,我相信。你可以嘗試刪除表名稱周圍的蜱蟲,或者將它們改爲常規引號而不是反蜱?

如果這樣不能解決問題,我會檢查以確保您指向正確的db文件。如果你指定一個不存在的文件名,你不會得到一個錯誤,它只會在那裏創建一個新的數據庫。我不確定在應用程序或單元測試的上下文中「當前目錄」是什麼,但請確定它指向您認爲的位置。要測試這個,可以將db文件名更改爲foo.db,運行單元測試,然後在機器上搜索foo.db以查看它創建的位置。這會告訴你你的應用程序在哪裏工作。

+1

我已經玩過報價和備註,並沒有幫助。我會做更多的玩弄路徑,並會保持你的發佈。感謝您告訴我關於僞造的DB名稱上沒有錯誤的信息。 – Bnjmn 2010-12-24 00:24:54

+1

很難決定誰應該贏得這一獎賞,但我決定把它交給Marplesoft來接近。爲我的數據庫使用完全合格的路徑最終取得了訣竅,這個答案促使我啓動了對路徑細節的調查,從而得到了分數。感謝所有您的貢獻。 – Bnjmn 2010-12-26 23:09:26

1

我不確定你的JDBC連接字符串是否正確。您使用的連接字符串以taskMan.db結尾,但上面的註釋意味着數據庫文件的名稱是taskManDb.db(請注意額外的Db)。

+0

我的數據庫名爲taskManDb.db – Bnjmn 2010-12-18 13:48:45

+1

在這種情況下,您的連接字符串應該是'jdbc:sqlite:src/database/taskManDb.db',而不是'jdbc:sqlite:src/database/taskMan.db' – 2010-12-18 14:18:15

+0

Litytestdata thanks for那個評論。我做了更改,但不幸的是,這並沒有解決問題。實際上,我發現自己也發現了這個錯誤,很高興你也看到了。 – Bnjmn 2010-12-21 23:13:15

1

它可能無法解決您的SQL INSERT問題,但我完全不關心您的DBRegistry實現。我會這樣寫:

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

不幸的是你的解決方案沒有解決問題,所以我會發布我的賞金作爲獎勵,但是我想說感謝你評論DBRegistry的結構,我一定會在那裏實現你的解決方案。您的版本比我的版本更有意義,我無法感謝您花時間重構我的代碼。 – Bnjmn 2010-12-23 03:46:51

+0

就像我在開始時所說的,我沒有試圖解決你的問題。我的機器上沒有安裝SQL Lite,所以我無法嘗試。但我會。 – duffymo 2010-12-23 03:53:38

+0

感謝您的支持,我非常感謝。 – Bnjmn 2010-12-23 04:05:01

0

也許你的桌子是在一個包中。所以你可能有這樣做

select * from Tasks.ComplextTask 

(「任務」是包)

+0

@ user521180感謝您的回覆,但不幸的是,任務不在包中。儘管如此,我感謝你的努力 – Bnjmn 2010-12-26 21:11:51

0

現在只是試圖找到在C具有相同名稱的文件:\ Windows \ System32下,你會發現它。它告訴我們你的路徑不正確。祝你今天愉快;

0

請在創建表格後和插入後提交您的連接。

相關問題