我在我的Java项目(嵌入模式)中使用H2数据库。 在家里的计算机上一切正常,可以建立连接,但在所有其他计算机上我总是收到以下错误:
org.h2.jdbc.JdbcSQLException:找不到表“CUSTOMERS”; SQL 声明:SELECT * FROM CUSTOMERS [42102-162]
我敢肯定,在数据库中一切都没问题,它应该是连接的东西。 但即使我导入h2-1.3.162.jar文件,错误仍然存在。
String dbClass = "org.h2.Driver";
String dbDriver = "jdbc:h2:~/cc";
String user = "user1";
String pass = "test1";
private Connection conn = null;
private Statement stmt = null;
private ResultSet rs = null;
public void connect() {
boolean done = false;
//load driver
try {
Class.forName(dbClass).newInstance();
System.out.println("driver loaded"); // This is shown in the Compiler
} catch (Exception ex) {
System.out.println("error while loading driver");
System.err.println(ex);
}
// Connection
try {
conn = DriverManager.getConnection(dbDriver, user, pass);
System.out.println("connected"); // This is shown in the Compiler
done = true;
} catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
}
public Vector select() {
data = new Vector();
try {
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM CUSTOMERS");
while (rs.next()) {
Vector row = new Vector();
row.add(rs.getInt("id"));
row.add(rs.getString("fname"));
row.add(rs.getString("lname"));
row.add(rs.getString("street"));
row.add(rs.getString("city"));
row.add(rs.getString("zip"));
row.add(rs.getString("state"));
row.add(rs.getString("phone"));
row.add(rs.getString("birthday"));
row.add(rs.getString("email"));
row.add(rs.getInt("code"));
data.add(row);
}
rs.close();
stmt.close();
} catch (SQLException ex) {
System.out.println("error while selecting"); // I receive this error
System.err.println(ex);
}
return data;
}
答案 0 :(得分:4)
问题不在于您的连接,因为如果它未能连接到数据库,您将在此之前收到异常。关于问题的例外是非常清楚的 - 它找不到CUSTOMERS
表。这可能是因为表根本不存在,或者连接指向错误的数据库;尝试输入表的完整架构信息,而不仅仅是它的名称,看看是否有效。
答案 1 :(得分:3)
我敢肯定,在数据库中,一切都没问题,应该是 连接的东西。但即使我导入h2-1.3.162.jar 文件,错误仍然存在。
检查您的假设。这个是不正确的。
消息中没有任何内容表明您无法连接。您连接到错误的数据库或您连接到的数据库没有创建表CUSTOMERS。 (应该命名为CUSTOMER,而不是复数。)
如果您停止假设您所做的一切都是正确的,那么您将更快地修复错误。你应该假设一切都是错的。
当你捕获到那个异常时,我会打印堆栈跟踪。它会为您提供更多信息。
答案 2 :(得分:3)
最后我明白了!
它与我的表无关,无法找到数据库。当尝试连接到String dbDriver = "jdbc:h2:~/cc";
无法找到的数据库时,将创建一个名为 cc 的新数据库(在我的情况下)(当然是空的,没有表)并建立连接。这就是我没有收到任何连接错误的原因
在下一步中,我尝试从新创建的空数据库中检索一些数据,因此收到错误,我的表不存在。
所以我更改了这一行:String dbDriver = "jdbc:h2:file:lib/cc";
并将其复制到我的应用程序的 lib 目录中我的旧数据库 cc.h2.db 。
这就是全部!
PS:这是一个类似的问题:h2 (embedded mode ) database files problem