H2:所有其他计算机上的错误
Posted
技术标签:
【中文标题】H2:所有其他计算机上的错误【英文标题】:H2: Error on all other computers 【发布时间】:2012-01-11 11:28:42 【问题描述】:我在我的 Java 项目中使用 H2 数据库(嵌入式模式)。 在我家里的电脑上一切正常,可以建立连接,但在所有其他电脑上,我总是收到以下错误:
org.h2.jdbc.JdbcSQLException:找不到表“CUSTOMERS”; SQL 声明:SELECT * FROM CUSTOMERS [42102-162]
我敢肯定,在 DB 中一切正常,应该是与连接有关。 但是即使我导入 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;
【问题讨论】:
【参考方案1】:问题不在于您的连接,因为如果连接数据库失败,您会在此之前收到异常。异常也很清楚问题所在 - 它找不到CUSTOMERS
表。这可能是因为该表根本不存在,或者连接指向错误的数据库;尝试输入表的完整架构信息,而不仅仅是其名称,看看是否可行。
【讨论】:
【参考方案2】:我敢肯定,在数据库中一切正常,应该是 有联系的东西。但即使我导入 h2-1.3.162.jar 文件,错误仍然存在。
检查您的假设。这个不正确。
消息中没有任何内容表明您无法连接。要么您连接到错误的数据库,要么您连接的数据库没有创建 TABLE CUSTOMERS。 (应该命名为 CUSTOMER,而不是复数。)
如果你不再假设你所做的一切都是正确的,你会更快地修复你的错误。你应该假设一切都错了。
当您捕获该异常时,我会打印堆栈跟踪。它将为您提供更多信息。
【讨论】:
我只是在我自己的电脑上尝试在家中完全相同的文件,它可以工作!我真的很困惑...... 我必须“随身携带”哪些文件?声明那些String dbClass = "org.h2.Driver"; String dbDriver = "jdbc:h2:~/cc";
并将h2.jar文件放入主文件夹内的lib文件夹是否足够?
嗯,你需要随身携带数据库文件。该文件是~/cc.h2.db
(其中~ 表示运行应用程序的用户的主目录)。
在哪里可以找到这个数据库文件?以及在哪里复制它? Netbeans 仅将 h2-1.3.162.jar 放在我的应用程序的 lib 文件夹中。
必须有人创建该表。你做了吗?如果没有,您为什么不阅读如何在 Hypersonic 中执行 DDL SQL 并在另一台机器上运行它? hsqldb.org/doc/guide/ch09.html【参考方案3】:
我终于明白了!
它与我的表无关,找不到数据库。当尝试连接到无法使用 String dbDriver = "jdbc:h2:~/cc";
找到的数据库时,将创建一个名为 cc 的新数据库(在我的情况下)(当然是一个没有表的空数据库)并建立连接。这就是我没有收到任何连接错误的原因。
在下一步中,我尝试从新创建的空数据库中检索一些数据,因此收到错误,即我的表不存在。
所以我更改了这一行:String dbDriver = "jdbc:h2:file:lib/cc";
并将旧数据库 cc.h2.db 复制到我的应用程序的 lib 目录中。
就是这样!
PS:这里有一个类似的问题:h2 (embedded mode ) database files problem
【讨论】:
以上是关于H2:所有其他计算机上的错误的主要内容,如果未能解决你的问题,请参考以下文章
如何修复其他计算机上的错误“其他计算机程序无法启动,因为您的计算机缺少libgcc_s_dw2-1.dll”[重复]
在局域网中的其他计算机上使用 Web API 时出现 403 禁止访问被拒绝错误