1

I have found this article which describes how to get the Derby database schema version from the command line with derbyrun.jar.

How can I determine the schema version from within my Java program?

EDIT: I answered my own question but I think it is not the best solution. When someone proposes a better solution I will accept that as an answer.

4

2 回答 2

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 对象会在其属性之一中包含有关数据库模式的信息,但我已经检查了所有这些,但事实并非如此。它们仅提供有关驱动程序版本的信息(可能与数据库架构不同)。

于 2013-06-16T13:56:58.640 回答
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”。

于 2021-02-18T20:08:07.200 回答