DatabaseMetaData#getColumns返回一个空的ResultSet

时间:2016-07-24 23:44:43

标签: java mysql jdbc metadata

我在使用Java和NetBeans从MySQL连接(本地运行,Ubuntu 14)检索元数据时遇到问题。我从getColumns对象的DatabaseMetaData方法获得一个空的ResultSet。

代码如下:

private static HashMap getColumnsFromDB(Connection con, String dbSchema, String tableName)    throws SQLException 
{
    HashMap Columns = new HashMap();

    DatabaseMetaData metadata = con.getMetaData();

    ResultSet rsColumns = metadata. getColumns(null, dbSchema.toUpperCase(), tableName.toUpperCase(), "%");

    while (rsColumns.next())
    {
        ColumnClass col = new ColumnClass();
        col.column_name = rsColumns.getString("COLUMN_NAME");
       col.mw_type =  UtilClass.toClass(rsColumns.getInt("DATA_TYPE"));   // Convert to java type
        col.is_nullable = rsColumns.getString("IS_NULLABLE");
        col.column_default = rsColumns.getString("COLUMN_DEF");

        Columns.put( col.column_name, col);
    }

    return Columns;
}    

我可以正常对数据库进行查询,用户是DBA,表格有列,我在其他问题上看到过这些问题可能有点棘手等等,但我已经尝试了很多方式和我没有预期的结果。

1 个答案:

答案 0 :(得分:1)

使用MySQL,术语“架构”和“数据库”意味着相同的事情。测试表明MySQL Connector / J没有关注schemaPattern方法的DatabaseMetaData#getColumns参数。

因此,如果您使用类似

的连接字符串
jdbc:mysql://localhost/db1

然后尝试使用

检索名为db2的“架构”(“数据库”)中表的列的相关信息
DatabaseMetaData metadata = con.getMetaData();
ResultSet rsColumns = metadata.getColumns(null, "db2", "mytable", "%");

如果数据库mytable中没有名为db1的表,您将获得一个空的ResultSet。要在db2中检索表格的信息,您需要使用catalog参数

DatabaseMetaData metadata = con.getMetaData();
ResultSet rsColumns = metadata.getColumns("db2", null, "mytable", "%");

或使用setCatalog

更改当前数据库
con.setCatalog("db2");
DatabaseMetaData metadata = con.getMetaData();
ResultSet rsColumns = metadata.getColumns(null, null, "mytable", "%");

注意第二个参数 - schemaPattern - 在上面两个工作示例中是null,但实际上它可以是任何东西;它完全被忽略了。

修改评论<评论

OP报告说,设置catalog参数确实是必需的方法,并且该表 - 并且可能是列名称在Linux下似乎区分大小写。 (我的测试表明这些名称在Windows下区分大小写。)