使用Java确定Derby数据库模式版本?

时间:2013-06-16 12:56:28

标签: java database-schema derby

我发现this article描述了如何使用derbyrun.jar从命令行获取Derby数据库模式版本。

如何从Java程序中确定架构版本?

编辑:我回答了我自己的问题,但我认为这不是最佳解决方案。当有人提出更好的解决方案时,我会接受这个答案。

2 个答案:

答案 0 :(得分:1)

我想出了一些用Java获取模式版本的东西,但它很丑陋(并不完全)。我希望那里的人有更好的东西:


public static void main(String[] args) throws Exception {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    String strConnectionURL = "jdbc:derby:c:\data\tomcat7\active\LearnyErnie\data\derby;create=false";
    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
    Connection connection = DriverManager.getConnection(strConnectionURL);
    String strCommand = "values syscs_util.syscs_get_database_property( 'DataDictionaryVersion' );";
    InputStream inputStream = new ByteArrayInputStream(strCommand.getBytes("UTF-8"));
    ij.runScript(connection, inputStream, "UTF-8", outputStream, "UTF-8");
    String strOutput = new String(outputStream.toByteArray());
    System.out.println("Output = " + strOutput);
}

strOutput将包含以下文本:


Output = CONNECTION0* -     jdbc:derby:c:\data\tomcat7\active\LearnyErnie\data\derby
* = current connection
ij> values syscs_util.syscs_get_database_property( 'DataDictionaryVersion' );
1
(long line of dashes taken out because it squirrels up the SO output)
10.9
1 row selected
ij>

上面的输出中的架构版本是“10.9”。你需要解析它。 (今天我对此并不感兴趣。这只是为了获得帮助中的额外信息 - >关于对话框,我将把整个丑陋的混乱写到屏幕上。)

我们当然不能指望解析逻辑在未来版本中工作,甚至不能调用syscs_get_database_property()本身。

我希望有人能够采用更有弹性的方式来做到这一点。

编辑:我后来发现,也许JDBC DatabaseMetaData对象可能在其中一个属性中包含有关数据库模式的信息,但我已经检查了所有这些,但事实并非如此。它们仅提供有关驱动程序版本的信息(可能与数据库模式不同)。

答案 1 :(得分:0)

这是很多年后的事了,但我一直在寻找有关从 Java 使用 syscs_util.syscs_get_database_property('DataDictionaryVersion') 的信息,并找到了这篇文章。以为我会分享一种从 Java 获取 DataDictionaryVersion 的更简单方法。此示例没有任何异常或其他错误处理,但提供了有关如何执行此操作的基本代码。我最初编写了更多代码来确定 Statement execute() 调用返回一个包含一列 varchar 数据的 ResultSet,列名称为 1。我使用 ResultSet.getMetaData() 来获取列信息。想通之后,我选择了 假设列信息不会改变并且没有保留该代码。

String connectionURL = "jdbc:derby:dbname";
java.sql.Connection conn = java.sql.DriverManager.getConnection(dbConnectionURL)
String ddVersionQueryStr = "values syscs_util.syscs_get_database_property( 'DataDictionaryVersion' )";
java.sql.Statement stmt = conn.createStatement();
boolean isResultSet = stmt.execute(ddVersionQueryStr);
java.sql.ResultSet resultSet = stmt.getResultSet();
resultSet.next();
System.out.print("ddVersion = " + resultSet.getString(1) + "\n");

我的输出是“10.11”。