java - 测试视图是否存在,但我的方法返回 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 很陌生,因此非常感谢任何帮助。
解决方案
正如 Turing86 的评论所说,像这样在原始 JDBC 中创建动态表是……重新发明轮子,你可能不应该那样做。
虽然在 SQL 数据库名称中不区分大小写,但在使用 JDBC 元数据时它们不区分大小写,而且您需要的大小写相当烦人地取决于数据库引擎。很可能您想要“view”而不是“VIEW”或“table_name”而不是 TABLE_NAME。
作为单独的说明,这确实是愚蠢的错误处理;异常包含 4 位信息(类型、消息、跟踪和原因),并且您丢弃了 4 个事实中的 3 个,将剩余的信息倾倒在某个会被噪音淹没的地方,然后您返回一个错误的答案。可怕。只需删除 try 块并添加throws SQLException
到您的代码中:对于检查表是否存在的方法来说,抛出它是完全合理的(并一直添加throws
子句直到 main,除非您实际上有一些代码来处理异常,并且“打印它们”或“记录它们”或“忽略它们”不处理它)。
我还会打印每个结果,以防“VIEW”是正确的但“TABLE_NAME”不是。
如果您无法弄清楚,请删除 VIEW 并将其设为空,在这种情况下,您将得到所有内容,这太多了,但是打印相关部分,您将从那里为您的数据库引擎找出正确的名称.
推荐阅读
- matlab - 如果数字相同,则计算平均值
- python - python字典在一个单独的文件中
- javascript - 为什么在 innerHTML 中使用的 Array#map 输出中的额外逗号?
- c# - C# - 如何编写一个将标签添加到列表框中的文本框,就像对stackoverflow标签进行编码一样?
- database - 在 Sequelize.js 种子模型中引用复合主键
- javascript - 如何在浏览器中打开的选项卡上访问 react chrome 扩展的路由?
- python - Django 在“auth”应用程序中缺少迁移
- php - Laravel 密码重置不起作用
- python - Pandas 整数过滤
- android - RecyclerView 与本地主机一起工作,但不显示在线服务器的项目