Java DatabaseMetaData.getSchemas()返回空结果集,应为非空结果集
试图了解这里发生了什么。DatabaseMetaData正在返回一个空结果集,而实际上相同的SQL查询不会返回空结果集。这不是一个主要问题,因为我使用第二个代码示例作为解决方法Java DatabaseMetaData.getSchemas()返回空结果集,应为非空结果集,java,mysql,jdbc,database-metadata,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.co
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
}
应为非空结果集,并已获取该结果集
据我所知,MySQL JDBC驱动程序认为是目录,而不是模式。因此,您应该改为使用(无论在哪里使用它,都需要使用catalog参数,而不是schema参数) 始终返回空的结果集:
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;
}
我意识到这是一篇老文章,但它出现在谷歌搜索这个主题时,这里的答案对我来说并不适用 经过更多的挖掘,我找到了正确的方法 首先,通过这样做,您可以获得所有元数据表类型的列表
DatabaseMetaData metaData = connection.getMetaData();
ResultSet rs = metaData.getTableTypes();
while (rs.next()) {
System.out.println(rs.getString(1));
}
我们感兴趣的表类型简称为表
这段代码将在SQL server中调出模式的所有名称,前提是您的凭据有权查看它们
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对我来说都很有用。有趣的是,这应该被认为是一个bug吗?这似乎意味着它应该返回一个带有sechema名称的ResultSet。@MichaelHobbs可能不是,架构和目录的定义在不同的数据库系统中是不同的。MySQL所称的模式更像是SQL标准中定义的目录。令人困惑的是,术语与MySQL中使用的内容不一致。我填写了一份bug报告,他们回来后基本上说这是一个长期存在的问题,可以追溯到早期。正如您所说,归根结底是如何定义模式/目录的。看起来仍然很奇怪,它们会有一个基本不起任何作用的函数。@MichaelHobbs我想使用
getCatalog
的决定早于信息模式的MySQL实现,并调用数据库模式而不是目录。很难扭转这样的决定,因为它会破坏已经依赖它的应用程序。JDBC规范明确指出,不存在或不受支持的元数据应返回空结果集。
DatabaseMetaData metaData = connection.getMetaData();
ResultSet rs = metaData.getTables(null, null, null, new String[]{"TABLE"});
while(rs.next())
{
System.out.println(rs.getString(1));
}