首页 > 解决方案 > 测试视图是否存在,但我的方法返回 false - 它应该返回 true

问题描述

我有一种方法viewExists可以查看我的数据库中是否有视图。目前我这样做,但我的方法似乎不知道这一点,因为它一直返回错误。

public static boolean viewExists(Connection conn, String view) throws SQLException {        
        boolean exists = false;
        try {
            ResultSet rs = conn.getMetaData().getTables(null, null, view, new String[] {"VIEW"});
                if (rs.next()) {
                    String name = rs.getString("TABLE_NAME");
                    if (name != null && name.contentEquals(view)) {
                        exists = true;
                    }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return exists;
    }

这样做的全部目的是查看视图是否存在,如果存在,我将其删除并创建一个新视图。

我对 JDBC 很陌生,因此非常感谢任何帮助。

标签: javasqldatabasejdbcview

解决方案


正如 Turing86 的评论所说,像这样在原始 JDBC 中创建动态表是……重新发明轮子,你可能不应该那样做。

虽然在 SQL 数据库名称中不区分大小写,但在使用 JDBC 元数据时它们不区分大小写,而且您需要的大小写相当烦人地取决于数据库引擎。很可能您想要“view”而不是“VIEW”或“table_name”而不是 TABLE_NAME。

作为单独的说明,这确实是愚蠢的错误处理;异常包含 4 位信息(类型、消息、跟踪和原因),并且您丢弃了 4 个事实中的 3 个,将剩余的信息倾倒在某个会被噪音淹没的地方,然后您返回一个错误的答案。可怕。只需删除 try 块并添加throws SQLException到您的代码中:对于检查表是否存在的方法来说,抛出它是完全合理的(并一直添加throws子句直到 main,除非您实际上有一些代码来处理异常,并且“打印它们”或“记录它们”或“忽略它们”不处理它)。

我还会打印每个结果,以防“VIEW”是正确的但“TABLE_NAME”不是。

如果您无法弄清楚,请删除 VIEW 并将其设为空,在这种情况下,您将得到所有内容,这太多了,但是打印相关部分,您将从那里为您的数据库引擎找出正确的名称.


推荐阅读