Java SQLException:没有这样的表
现在我在连接数据库时遇到了一些问题。我知道我要查找的表是存在的,因为当我使用命令行访问它们时,可以查询它们 可能是一些小疏忽,但我希望能得到一些帮助 这是我连接数据库的地方 包持久性Java SQLException:没有这样的表,java,sqlite,jdbc,Java,Sqlite,Jdbc,现在我在连接数据库时遇到了一些问题。我知道我要查找的表是存在的,因为当我使用命令行访问它们时,可以查询它们 可能是一些小疏忽,但我希望能得到一些帮助 这是我连接数据库的地方 包持久性 import java.sql.DriverManager; import java.sql.Connection; import java.sql.SQLException; public class DBRegistry { private static DBRegistry db = null;
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)
我不确定您的JDBC连接字符串是否正确。您使用的连接字符串以
taskMan.db
结尾,但是您上面的评论暗示数据库文件的名称是taskManDb.db
(注意额外的db
)。它可能无法解决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();
}
}
}
我注意到,在单元测试和其他代码中,表名周围都使用了反勾号。在最新版本的sqlite中,这很好,但在较旧的版本中,我相信它没有得到很好的处理。您可以尝试删除表名周围的记号,或者将它们更改为常规引号而不是反记号吗
如果这不能解决问题,我会检查以确保您指向的是正确的db文件。如果指定一个不存在的文件名,则不会出现错误,它只会在那里创建一个新数据库。我不确定应用程序或单元测试上下文中的“当前目录”是什么,但请确保它指向您认为它所在的位置。要测试这一点,您可以将db文件名更改为
foo.db
,运行单元测试,然后在计算机中搜索foo.db
,查看它是在哪里创建的。这将告诉您应用程序的运行位置。可能您的表在一个包中。所以你可能会这样做
select * from Tasks.ComplextTask
('Tasks'是软件包)现在只要在c:\windows\system32中找到一个同名文件,您就会找到它。它告诉我们您的路径不正确。祝你有愉快的一天 请在创建表后和插入后提交连接。我想知道数据库的路径是否设置不正确,但我想知道这是否会导致第一次单元测试失败。尝试
DBNAME.singleTask
作为一个快照,它应该可以工作。尝试使用其他前端连接同一个DB以检查tables@org.life.java我试着使用命令行,结果成功了!ben@ben-笔记本电脑:~/workspace/taskManager_v4/src/database$sqlite taskManDb.db sqlite version 2.8.17输入“.help”以获取sqlite>的说明。表complexTask repeatingTask singleTask subTaskI在iPHone应用程序开发中使用sqlite的体验与CoCoa相同,当时的问题是命令行引用了其他一些DB,而我的应用程序引用了其他一些.sqlite文件。确保这一点在这种情况下,您的连接字符串应该是jdbc:sqlite:src/database/taskManDb.db
,而不是jdbc:sqlite:src/database/taskMan.db
Litytestdata谢谢您的评论。我已经做出了改变,但不幸的是,这并没有解决问题。事实上,我自己也在发布后发现了这个错误,很高兴你也看到了。不幸的是,你的解决方案没有解决这个问题,因此我将发放我的奖金作为奖励,不过我想说谢谢你对DBRegistry结构的评论,我一定会在那里实施你的解决方案。你的版本比我的版本更有意义,我非常感谢你花时间重构我的代码。就像我一开始说的,我没有试图解决你的问题。我的机器上没有安装SQLLite,因此无法尝试。但我会的。我玩过引号和反勾号,但那没用。我会做一些更多的路径游戏,并会随时通知你。谢谢你让我知道在一个伪造的DB名称上没有出现错误。很难决定谁应该在这一个上赢得赏金,但我决定把它给Marplesoft,因为它是最接近的。为我的数据库使用完全限定的路径最终达到了目的,这个答案促使我对路径的细节展开调查,因此获得了分数。感谢大家的贡献。@user521180感谢您的回复,但不幸的是任务不在包中。不过我很感谢你的努力。
select * from Tasks.ComplextTask