2016-07-24 38 views
2

Ich habe ein Problem beim Abrufen von Metadaten aus einer lokal laufenden MySQL-Verbindung, Ubuntu 14, mit Java und NetBeans. Ich bekomme ein leeres ResultSet von der getColumns Methode eines DatabaseMetaData Objekts.DatabaseMetaData # getColumns gibt ein leeres ResultSet zurück

Der Code ist der folgende:

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; 
}  

ich normalerweise Anfragen an die Datenbank tun kann, ist der Benutzer DBA, die Tabellenspalten hat, habe ich in anderen Fragen gesehen, dass es ein wenig schwierig sein kann, mit Fällen und so weiter, aber ich habe es auf viele Arten versucht, und ich hatte keine erwarteten Ergebnisse.

Antwort

1

Mit MySQL bedeuten die Begriffe "Schema" und "Datenbank" dasselbe. Tests zeigen, dass MySQL   Connector/J dem schemaPattern-Parameter der DatabaseMetaData#getColumns-Methode keine Beachtung schenkt.

Also, wenn Sie eine Verbindungszeichenfolge wie

jdbc:mysql://localhost/db1 

und verwenden Sie dann versuchen, Informationen über die Spalten einer Tabelle in dem „Schema“ („database“) db2 mit

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

erhalten Sie ein leeres ResultSet, wenn in der Datenbank db1 keine Tabelle mit dem Namen mytable vorhanden ist. Um die Informationen für die Tabelle abzurufen db2 müssen Sie entweder den catalog Parameter mit setCatalog

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

Hinweis

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

oder ändern Sie die aktuelle Datenbank verwenden, dass das zweite Argument – schemaPattern – ist null in den obigen zwei Arbeitsbeispielen, aber tatsächlich kann es alles sein; Es wird einfach ignoriert.

bearbeiten re: Kommentare

OP berichtet, dass die catalog Parametereinstellung ist in der Tat die erforderliche Vorgehensweise, und diese Tabelle – und vermutlich Spalte – Namen erscheinen Groß- und unter Linux sein. (Meine Tests zeigen an, dass solche Namen sind, nicht Groß-und Kleinschreibung unter Windows.)

+0

Es funktioniert nicht. Ich vermute, dass etwas mit dem Treiber nicht stimmt, jedenfalls benutze ich Ubuntu 14.04, MySQL 5.5, JDBC 5.1.35, JDK 1.8 und Netbeans 8.0.2, falls jemand ein Kompatibilitätsproblem kennt. – Checho

+0

Was gibt 'con.getCatalog()' zurück? Der erwartete Datenbankname? Eine leere Zeichenfolge? "null"? –

+0

Es ist eine leere Zeichenfolge im Methodenaufruf. Nach con.setCatalog() nimmt es den gegebenen Wert (in diesem Fall "Benutzer"), gibt aber immer noch einen leeren Satz zurück. Wenn ich die Informationsschemadatenbank abfrage, haben alle Tabellen den Wert "def" in der Spalte TABLE_CATALOG (ich denke, es bedeutet so etwas wie 'default'). Ich benutze das jetzt als Workaround. – Checho