2016-07-24 58 views
2

我在從Java連接和本地運行的Ubuntu 14連接到Java和NetBeans的MySQL連接中檢索元數據的問題。我從DatabaseMetaData對象的getColumns方法中得到一個空結果集。DatabaseMetaData#getColumns返回一個空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

對於MySQL,術語「模式」和「數據庫」表示相同的東西。測試表明MySQL   Connector/J不關注DatabaseMetaData#getColumns方法的schemaPattern參數。

所以,如果你使用一個連接字符串像

jdbc:mysql://localhost/db1 

,然後嘗試檢索表中的「模式」中列的信息(「數據庫」)命名db2

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

如果在數據庫db1中沒有名爲mytable的表,您將得到一個空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下區分大小寫。)

+0

它不起作用。我懷疑它可能是錯誤的驅動程序,在任何情況下,我使用的是Ubuntu 14.04,MySQL 5.5,jdbc 5.1.35,jdk 1.8和netbeans 8.0.2,以防有人知道某些兼容性問題。 – Checho

+0

'con.getCatalog()'返回什麼?期望的數據庫名稱?一個空字符串? 'null'? –

+0

在方法調用中它是一個空字符串。在con.setCatalog()之後,它將使用給定的值(本例中爲「用戶」),但仍返回一個空集。當我查詢信息模式數據庫時,TABLE_CATALOG列中的所有表都具有值「def」(我認爲這意味着類似'default')。我現在將此用作解決方法。 – Checho