我需要在Java程序中使用JDBC枚举Derby(aka Java DB)数据库中的表.我所知道的就是SHOW TABLES命令.
我第一次试着用类似的东西......
String strConnectionURL = "jdbc:derby:/path/to/derby/database;create=false";
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection connection = DriverManager.getConnection(strConnectionURL);
Statement statement = connection.createStatement();
boolean boResult = statement.execute("SHOW TABLES");
if (boResult) {
System.out.println("yay!");
}
Run Code Online (Sandbox Code Playgroud)
...但是会引发异常:
java.sql.SQLSyntaxErrorException: Syntax error: Encountered "SHOW" at line 1, column 1.
Run Code Online (Sandbox Code Playgroud)
接下来我想也许我需要使用CallableStatement所以我试过这个...
String strConnectionURL = "jdbc:derby:/path/to/derby/db;create=false";
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection connection = DriverManager.getConnection(strConnectionURL);
CallableStatement statement = connection.prepareCall("SHOW TABLES");
boolean boResult = statement.execute();
if (boResult) {
System.out.println("yippee!");
}
Run Code Online (Sandbox Code Playgroud)
...但是会引发同样的异常:
java.sql.SQLSyntaxErrorException: Syntax error: Encountered "SHOW" at line 1, column 1.
Run Code Online (Sandbox Code Playgroud)
那么,任何人都可以帮我从JDBC中枚举Derby(Java DB)数据库中的表吗?
编辑:我环顾四周,开始觉得这可能是一个普遍的JDBC问题.换句话说,可以/将使用可以从Connection对象检索的DatabaseMetaData对象枚举所有db表.调查(并期待回应)......
编辑2:我找到了一个纯粹的JDBC解决方案,但仍然很高兴听到替代方案......
String strConnectionURL = "jdbc:derby:/path/to/db;create=false";
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection connection = DriverManager.getConnection(strConnectionURL);
DatabaseMetaData dbmd = connection.getMetaData();
ResultSet resultSet = dbmd.getTables(null, null, null, null);
while (resultSet.next()) {
String strTableName = resultSet.getString("TABLE_NAME");
System.out.println("TABLE_NAME is " + strTableName);
}
Run Code Online (Sandbox Code Playgroud)
Show Tables是一个ij命令,而不是基本的SQL语句,因此您无法直接执行它.正如您在"编辑2"中所述,您可以使用DatabaseMetaData来执行此操作.另外两种方法是:您可以从系统目录中选择(参见http://db.apache.org/derby/docs/10.8/ref/rrefsistabs24269.html),或者您可以使用"ij.runScript"从程序中运行ij工具的方法,并将"show tables"命令传递给它(参见http://db.apache.org/derby/docs/10.8/publishedapi/jdbc3/org/apache/derby/tools/ ij.html)
正如Bryan建议的ij.runScript - 代码如下所示:
public void showTbls() throws Exception{
String sqlIn = "SHOW TABLES;";
InputStream stream = new ByteArrayInputStream(sqlIn.getBytes(StandardCharsets.UTF_8));
ij.runScript(conn,stream,StandardCharsets.UTF_8.name(), System.out,"UTF-8");
stream.close();
}
Run Code Online (Sandbox Code Playgroud)
假设conn是一个打开的德比连接
但缺点是您只能获得字符串输出。不是您将获得的结果集:
Statement stmt = conn.createStatement();
ResultSet results = stmt.executeQuery("SELECT * FROM sys.systables");
Run Code Online (Sandbox Code Playgroud)
或者如果您只想要用户表名,您可以使用以下 SQL:
ResultSet results = stmt.executeQuery("SELECT TABLENAME FROM SYS.SYSTABLES WHERE TABLETYPE='T'");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11674 次 |
| 最近记录: |