3

ここで何が起こっているのかを理解しようとしています。DatabaseMetaData は空の結果セットを返していますが、事実上同じである SQL クエリはそうではありません。回避策として 2 番目のコード例を使用しているので、大きな問題ではありません。

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
}

空でない結果セットが期待され、それが得られました。

4

2 に答える 2

3

私が知る限り、MySQL JDBC ドライバーはそれをスキーマではなくカタログと見なします。そのため、getCatalogs代わりに使用する必要があります (使用する場合は常に、スキーマ パラメーターではなく、カタログ パラメーターを使用する必要があります)。

getSchemasConnector/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_SCHEMATABLE_CATcatalogTABLE_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);
于 2015-06-01T10:33:12.330 に答える