试图了解这里发生了什么。 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 tuples = new ArrayList();
java.sql.ResultSet results = buildResultSet(fields, tuples);
return results;
}
getCatalogs
trở lại SHOW DATABASES
的结果。而在 DatabaseMetaDataUsingInfoSchema
您会看到别名为 TABLE_CAT
(用于目录)的信息架构的 TABLE_SCHEMA
列,并且 catalog
参数作为 的值传递查询中的 >TABLE_SCHEMA
Danh sách:
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;
thử {
pStmt = prepareMetaDataSafeStatement(sql);
if (catalog != null) {
pStmt.setString(1, catalog);
} khác {
pStmt.setString(1, "%");
}
pStmt.setString(2, table);
pStmt.setString(3, columnNamePattern);
Tôi là một lập trình viên xuất sắc, rất giỏi!