我在使用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,表格有列,我在其他问题上看到过这些问题可能有点棘手等等,但我已经尝试了很多方式和我没有预期的结果。
答案 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下不区分大小写。)