我正在用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'.
看起来init()
方法中的ResultSet rs为空。但是,在调用SELECT * FROM mytable
之后,数据就存在并且它们是正确的。
我该如何解决这个问题?哪里可以问题?
答案 0 :(得分:2)
Derby的MediaMuxer.stop()
实现似乎区分大小写,Derby似乎也强制您的表名称为大写。
java.sql.SQLException:表/视图' MYTABLE'已经存在于Schema' APP'。
中
所以,你可能需要使用像
这样的东西.getTables
以获得匹配。