java - 无法访问 PUBLIC 模式中的表

标签 java sql jdbc hsqldb

设置:

我使用 JDBC 连接到独立的(文件中的数据库)HSQLDB。连接在程序启动时打开,在程序退出时关闭。该用户是使用 ADMIN 权限创建的。

我已使用 hsqldb.jar 数据库管理器在数据库中创建一个名为 COMPONENTS 的表。它驻留在 PUBLIC 架构中,我可以使用数据库管理器在其中添加和删除记录。

我使用以下代码(在 main 方法中调用)来证明我可以正确查询数据库:

public static void displayAllRows() {
    String sql = "SELECT * FROM INFORMATION_SCHEMA.AUTHORIZATIONS";
    try (
        Statement stmt = CONN.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        ) {

        System.out.println("Authorizations Table:");
        while(rs.next()) {
        StringBuilder bf = new StringBuilder();
        bf.append(rs.getString("AUTHORIZATION_NAME")).append(": ");
        bf.append(rs.getString("AUTHORIZATION_TYPE")).append(", ");
        System.out.println(bf.toString());
        }
    } catch (SQLException ex) {
        Logger.getLogger(CompManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}

基于在数据库管理器工具中使用 SELECT * FROM INFORMATION_SCHEMA.AUTHORIZATIONS 语句,上述代码的输出是正确的。

问题:

然后我运行下面的简化代码。唯一的更改是 SELECT 语句,我取出了 try block 中的所有内容(这样就不会意外导致错误)。

private static final Connection CONN = ConnectionManager.getInstance().getConnection();

public static void displayAllRows() {
    String sql = "SELECT * FROM COMPONENTS";
    try (
        Statement stmt = CONN.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        ) {


    } catch (SQLException ex) {
        Logger.getLogger(CompManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}

这会引发异常:java.sql.SQLSyntaxErrorException:用户缺乏权限或未找到对象:COMPONENTS

我还尝试在声明中使用PUBLIC.COMPONENTS。然而,当我将该语句复制/粘贴到数据库管理器中时,它工作正常(我在两个地方都使用同一用户登录)。

问题:

考虑到我对数据库还很陌生,我可能做错了什么。我可以尝试什么才能使第二个查询成功?

我搜索了SO和互联网,并找到了数百篇关于此特定异常的帖子,但它是在如此广泛的情况下抛出的,因此解决方案没有帮助。

答案:

不知何故,我不小心用我的程序连接到了与数据库管理器不同的数据库。解决方案是将整个文件路径放入数据库连接字符串中,而不是使用相对引用

最佳答案

您正在连接到两个不同的数据库。您的数据库 URL 可能指定了一个相对于您启动 DatabaseManager 和应用程序的目录的文件路径。使用绝对路径或使用 ~ 符号表示 user.home 目录的路径。

由于您是数据库新手,因此启动 HSQLDB 服务器并使用相同的 URL 从您的应用程序和 DatabaseManager 连接到它会更容易。

关于java - 无法访问 PUBLIC 模式中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36971172/

相关文章:

java - 读取联系人时应用程序崩溃

java8 对函数结果的使用改变了进一步的处理

java - 为什么在 Java 中命令行参数作为字符串数组传递?

c# - 在 C# 中将 SQL 查询的结果从一个数据库插入到另一个数据库

mysql - 简单的 MySQL 查询 - 更改表格式

mysql - 不使用json显示数据库中的数据

java - 从多个表中选择 count(*)

sql - 如何在 SQL Server 中使用 INNER JOIN 从多个表中删除

java - 使用PreparedStatement在where子句中传递字符串

java.sql.SQLException : Invalid handle