gpt4 book ai didi

java - DatabaseMetaData#g​​etTables 在 Derby 中找不到现有表

转载 作者:搜寻专家 更新时间:2023-10-30 20:24:05 25 4
gpt4 key购买 nike

我正在用 Java 连接到 Derby 数据库:

public EmbeddedDerbyDataConnection(String name) throws SQLException {

EmbeddedDataSource dataSource = new EmbeddedDataSource();
dataSource.setDatabaseName(name);
dataSource.setCreateDatabase("create");

this.connection = dataSource.getConnection();
init();
}

连接似乎没问题。然后我调用 init() 方法创建表(如果它不存在)并用一些默认数据填充该表:

private void init() throws SQLException {
DatabaseMetaData metaData = this.connection.getMetaData();
ResultSet rs = metaData.getTables(null, null, "mytable", null);
if (rs.next()) {
System.out.println("Table already exists.");
} else {
Statement stmt = this.connection.createStatement();
String query = "CREATE TABLE mytable (...)";
stmt.executeUpdate(query);
stmt.close();

stmt = this.connection.createStatement();
query = "INSERT INTO mytable VALUES (...)";
stmt.executeUpdate(query);
stmt.close();
}
}

第一次创建 EmbeddedDerbyDataConnection 对象后,似乎没问题。我通过 SELECT * FROM mytable 对其进行了测试,它返回了我放入该表中的默认数据。

第二次调用后,我得到:Exception in thread "main"java.sql.SQLException: Table/View 'mytable' already exists in Schema 'APP'. 它看起来像 ResultSet rs在 init() 方法中是空的。然而,在调用 SELECT * FROM mytable 之后,数据就在那里并且是正确的。

我该如何解决这个问题?问题出在哪里?

最佳答案

Derby 的 .getTables 实现似乎是区分大小写的,而且 Derby 似乎也强制您的表名为大写。

java.sql.SQLException: Table/View 'MYTABLE' already exists in Schema 'APP'.

所以,你可能需要使用类似的东西

ResultSet rs = metaData.getTables(null, null, "mytable".toUpperCase(), null);

为了匹配。

关于java - DatabaseMetaData#g​​etTables 在 Derby 中找不到现有表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47224875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com