试图了解这里发生了什么。 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
}
预期非空结果集并获得它。
答案 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