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

标签 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
}

期望一个非空结果集并得到它。

最佳答案

据我所知,MySQL JDBC 驱动程序认为这是一个目录,而不是模式。所以你应该使用 getCatalogs相反(无论你在哪里使用它,你都需要使用目录参数,而不是模式参数)。

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_CAT(用于目录)的信息架构的 TABLE_SCHEMA 列,并且 catalog 参数作为 的值传递查询中的 >TABLE_SCHEMA 列:

String sql = "SELECT TABLE_SCHEMA AS TABLE_CAT, NULL AS TABLE_SCHEM, TABLE_NAME,"
        + "COLUMN_NAME, NULL AS GRANTOR, GRANTEE, PRIVILEGE_TYPE AS PRIVILEGE, IS_GRANTABLE FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE "
        + "TABLE_SCHEMA LIKE ? AND TABLE_NAME =? AND COLUMN_NAME LIKE ? ORDER BY COLUMN_NAME, PRIVILEGE_TYPE";

java.sql.PreparedStatement pStmt = null;

try {
    pStmt = prepareMetaDataSafeStatement(sql);

    if (catalog != null) {
        pStmt.setString(1, catalog);
    } else {
        pStmt.setString(1, "%");
    }

    pStmt.setString(2, table);
    pStmt.setString(3, columnNamePattern);

关于Java DatabaseMetaData.getSchemas() 返回空 ResultSet,预期非空 ResultSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30567224/

相关文章:

java - 用 Java 实现一个简单的 HTTPS 代理应用程序?

java - java中检查两个字符串是否相等

mysql - 如何在mysql中使用正则表达式提取子字符串

java - 类似名称的查询不起作用

mysql - 我无法在 Logstash 中使用 jdbc 连接 MySQL 数据库

java - Dao复杂逻辑sql

java - 编写java代码来查找最大值和最小值。如果只有一个输入就会卡住

mysql - OAuth(Facebook、Twitter)和基本登录 - 用户表

java - Hibernate HQL 是否支持正则表达式模式匹配?

java - SQL 中的占位符