Java DatabaseMetaDatagetTables在Derby中找不到现有表
我正在用Java连接Derby数据库:Java DatabaseMetaDatagetTables在Derby中找不到现有表,java,database,jdbc,derby,Java,Database,Jdbc,Derby,我正在用Java连接Derby数据库: public EmbeddedDerbyDataConnection(String name) throws SQLException { EmbeddedDataSource dataSource = new EmbeddedDataSource(); dataSource.setDatabaseName(name); dataSource.setCreateDatabase("create"); this.conne
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的对象之后,看起来还可以。我通过从mytable中选择*来测试它,它返回了我放在这个表中的默认数据
在第二次调用之后,我在线程main java.sql.SQLException:Table/View“mytable”中得到了:Exception,模式“APP”中已经存在。init方法中的ResultSet rs看起来是空的。但是,在从mytable调用SELECT*之后,数据就在那里,并且是正确的
我怎样才能解决这个问题?问题出在哪里 Derby的.getTables实现似乎区分大小写,而且Derby似乎还强制表名为大写
java.sql.SQLException:架构“APP”中已存在表/视图“MYTABLE”
因此,您可能需要使用以下内容
ResultSet rs=metaData.gettablesnall,null,mytable.toUpperCase,null;
为了获得匹配。JDBC规范要求区分大小写,例如模式参数指定必须与存储在数据库中的表名匹配,因此如果数据库以大写形式存储不带引号的对象名,则模式也应为大写以匹配。