2010-12-18 113 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

请在创建表格后和插入后提交您的连接。

相关问题