2016-07-24 3 views
2

У меня возникает проблема получения метаданных из подключения MySQL, выполняемого локально, Ubuntu 14, с Java и NetBeans. Я получаю пустой ResultSet из метода getColumns объекта DatabaseMetaData.DatabaseMetaData # getColumns возвращает пустой ResultSet

Код следующее: DBA

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

Я могу делать запросы к базе данных, как правило, пользователь, таблица имеет столбцы, я видел в других вопросах, которые он может быть немного сложнее, с случаями и так далее, но я пробовал по-разному, и у меня не было ожидаемых результатов.

ответ

1

С MySQL термины «Схема» и «База данных» означают то же самое. Тестирование указывает, что MySQL   Соединитель/J не обращает внимания на параметр schemaPattern метода DatabaseMetaData#getColumns.

Таким образом, если вы используете строку соединения, как

jdbc:mysql://localhost/db1 

, а затем попытаться получить информацию о столбцах таблицы в «схемы» («база данных») под названием db2 с

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

вы получите пустой ResultSet, если в базе нет таблицы с именем mytable в базе db1. Для того, чтобы получить информацию для таблицы в 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 в приведенных выше двух рабочих примерах, но на самом деле это может быть что угодно; это просто игнорируется.

Edit Re: комментарии сообщает

О.П., что установка параметра 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() он принимает заданное значение («Пользователи» в этом случае), но все равно возвращает пустой набор. Когда я запрашиваю базу данных информационной схемы, все таблицы имеют значение «def» в столбце TABLE_CATALOG (я думаю, что это означает что-то вроде «по умолчанию»). Я использую это сейчас как обходной путь. – Checho