Java DatabaseMetaData.getSchemas()返回空ResultSet,期望非空ResultSet

时间:2015-06-01 06:45:11

标签: java mysql jdbc database-metadata

试图了解这里发生了什么。 DatabaseMetaData返回一个空的结果集,而实际上相同的SQL查询则没有。这不是一个主要问题,因为我使用第二个代码示例作为解决方法。

DatabaseMetaData dmd = this.connection.getMetaData();
ResultSet rs = dmd.getSchemas();
while (rs.next()){
  // empty result set
}

预期非空结果集。

ResultSet rs = this.connection.prepareStatement("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA;").executeQuery();
while (rs.next()){
  // non-empty result set with expected results
}

预期非空结果集并获得它。

2 个答案:

答案 0 :(得分:3)

据我所知,MySQL JDBC驱动程序认为是目录,而不是模式。所以你应该使用getCatalogs代替(在你使用它的任何地方,你需要使用catalog参数,而不是schema参数)。

getSchemas method in Connector/J始终返回空结果集:

public java.sql.ResultSet getSchemas() throws SQLException {
    Field[] fields = new Field[2];
    fields[0] = new Field("", "TABLE_SCHEM", java.sql.Types.CHAR, 0);
    fields[1] = new Field("", "TABLE_CATALOG", java.sql.Types.CHAR, 0);

    ArrayList<ResultSetRow> tuples = new ArrayList<ResultSetRow>();
    java.sql.ResultSet results = buildResultSet(fields, tuples);

    return results;
}

getCatalogs会返回SHOW DATABASES的结果。在DatabaseMetaDataUsingInfoSchema中,您会看到信息架构的TABLE_SCHEMA列别名为TABLE_CAT(对于目录),catalog参数作为{{1}的值传递查询中的列:

TABLE_SCHEMA

答案 1 :(得分:1)

我意识到这是一篇旧帖子,但它出现在有关此主题的 Google 搜索中,这里的答案对我不起作用。

经过更多的挖掘,我找到了正确的方法。

首先,您可以通过执行此操作获取所有元数据表类型的列表

    DatabaseMetaData metaData = connection.getMetaData();
    ResultSet rs = metaData.getTableTypes();
    while (rs.next()) {
        System.out.println(rs.getString(1));
    }

我们感兴趣的表类型简称为TABLE

并且此代码将提取 SQL 服务器中架构的所有名称,假设您的凭据有权查看它们。

    DatabaseMetaData metaData = connection.getMetaData();
    ResultSet rs = metaData.getTables(null, null, null, new String[]{"TABLE"});
    while(rs.next())
    {
        System.out.println(rs.getString(1));
    }

无论如何它对我来说都适用于 Java 8 和 mysql-connector-java-8.0.22