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:所有其他计算机上的错误的主要内容,如果未能解决你的问题,请参考以下文章

SDL 应用程序无法在其他计算机上运行

如何修复其他计算机上的错误“其他计算机程序无法启动,因为您的计算机缺少libgcc_s_dw2-1.dll”[重复]

在局域网中的其他计算机上使用 Web API 时出现 403 禁止访问被拒绝错误

C# 程序不会在其他计算机上启动。 OleDB 命令中的错误

本地计算机上的 Windows 服务启动然后停止错误

尝试保存时 VBA 宏抛出错误(但仅在一台计算机上)