connection.getMetaData, похоже, не возвращает информацию о таблице

Я использую простое приложение для изучения базы данных с помощью Apache.Derby и работы в Eclipse. Следующий код работает нормально, но conn.getMetaData() не возвращает ничего значимого в отношении таблицы — например, colnameslist.size равен 0. Однако я добавил meta.getDatabaseProductName(), чтобы увидеть, что произошло, и он возвращает «Apache.Derby», поэтому я предполагаю, что есть какая-то связь.

The connection url is "jdbc:derby:C:/Users/RonLaptop/MyDB".
The string passed into getTableContents() is "MYENERGYAPP.ENERGYTABLE7".

Поскольку это не ошибка, я немного растерялся.

package com.energy;

import javax.swing.*; 
import javax.swing.table.*; 
import java.sql.*; 
import java.util.*;
/** an immutable table model built from getting 
    metadata about a table in a jdbc database 
*/ 
public class JDBCTableModel extends AbstractTableModel {
    Object[][] contents;
    String[] columnNames;
    Class[] columnClasses;

    public JDBCTableModel (Connection conn,
               String string)
        throws SQLException {
        super();
        getTableContents (conn, string);

    }
    protected void getTableContents (Connection conn,
                 String string)
        throws SQLException {

    // get metadata: what columns exist and what
    // types (classes) are they?
    DatabaseMetaData meta = conn.getMetaData();
    String productName = meta.getDatabaseProductName();
    String[] types = null;

    System.out.println ("got meta = " + meta);
    ResultSet results =
        meta.getColumns (null, null, string, null) ;
    System.out.println ("got column results");
    ArrayList colNamesList = new ArrayList();
    ArrayList colClassesList = new ArrayList();
    while (results.next()) {
        colNamesList.add (results.getString ("COLUMN_NAME")); 
        System.out.println ("name: " + 
            results.getString ("COLUMN_NAME"));
        int dbType = results.getInt ("DATA_TYPE");
        switch (dbType) {
        case Types.INTEGER:
    colClassesList.add (Integer.class); break; 
        case Types.FLOAT:
    colClassesList.add (Float.class); break; 
        case Types.DOUBLE: 
        case Types.REAL:
    colClassesList.add (Double.class); break; 
        case Types.DATE: 
        case Types.TIME: 
        case Types.TIMESTAMP:
    colClassesList.add (java.sql.Date.class); break; 
        default:
    colClassesList.add (String.class); break; 
        }; 
        System.out.println ("type: " +
            results.getInt ("DATA_TYPE"));
        }
        columnNames = new String [colNamesList.size()];
        colNamesList.toArray (columnNames);
        columnClasses = new Class [colClassesList.size()];
        colClassesList.toArray (columnClasses);

        // get all data from table and put into
        // contents array

        Statement statement =
    conn.createStatement ();
        results = statement.executeQuery ("SELECT * FROM " +
                      string);

        ArrayList rowList = new ArrayList();
        while (results.next()) {
    ArrayList cellList = new ArrayList(); 
    for (int i = 0; i<columnClasses.length; i++) { 
        Object cellValue = null;


        if (columnClasses[i] == String.class) 
    cellValue = results.getString (columnNames[i]); 
        else if (columnClasses[i] == Integer.class) 
    cellValue = new Integer ( 
            results.getInt (columnNames[i])); 
        else if (columnClasses[i] == Float.class) 
    cellValue = new Float ( 
            results.getInt (columnNames[i])); 
        else if (columnClasses[i] == Double.class) 
    cellValue = new Double ( 
            results.getDouble (columnNames[i]));
        else if (columnClasses[i] == java.sql.Date.class) 
    cellValue = results.getDate (columnNames[i]); 
        else 
    System.out.println ("Can't assign " + 
            columnNames[i]);
        cellList.add (cellValue);
    }// for
    Object[] cells = cellList.toArray();
    rowList.add (cells);

} // while
// finally create contents two-dim array
contents = new Object[rowList.size()] [];
for (int i=0; i<contents.length; i++)

    contents[i] = (Object []) rowList.get (i);
System.out.println ("Created model with " +
           contents.length + " rows");

// close stuff
results.close();
statement.close();

}
// AbstractTableModel methods
public int getRowCount() {
    return contents.length;
}

public int getColumnCount() {
    if (contents.length == 0)
        return 0;
    else
        return contents[0].length;
    }

    public Object getValueAt (int row, int column) {
        return contents [row][column];
    }

    // overrides methods for which AbstractTableModel
    // has trivial implementations

    public Class getColumnClass (int col) {
        return columnClasses [col];
    }

    public String getColumnName (int col) { 
        return columnNames [col]; 
    } 
}

person ron    schedule 07.01.2012    source источник
comment
Пожалуйста, перефразируйте свой вопрос. Какие проблемы у вас есть в этом коде?   -  person kv-prajapati    schedule 07.01.2012
comment
Извините, что не разъяснил проблему. Мне не удалось собрать информацию о базе данных - имена столбцов, типы и значения, но не было ошибки, чтобы дать подсказку. Однако ответ rcook ниже решил это - чувствительность к регистру.   -  person ron    schedule 07.01.2012


Ответы (3)


Попробуйте использовать только имя таблицы; когда я это делаю, мне не нужно ставить имя уровня «приложение» перед именем таблицы (т.е. просто EVERYGYTABLE7). И убедитесь, что имя таблицы имеет эту заглавную букву; можно создать таблицу с именем в смешанном регистре, и я думаю, что Дерби строго относится к этому.

person arcy    schedule 07.01.2012
comment
Спасибо - чувствительность к регистру вылечила это! Я обнаружил, что уровень «приложение» необходим в инструкции sql. - person ron; 07.01.2012

Мне просто совершенно непонятно из вашего вопроса. Во-первых, попробуйте, существует ли ваша таблица (игнорируя регистр) как что-то вроде упомянутой ниже.

ResultSet rs = null;

try 
{
    DatabaseMetaData meta = conn.getMetaData();
    rs = meta.getTables(null, null, null, new String[] {"TABLE"});
    while (rs.next())
    {
        String currentTableName = rs.getString("TABLE_NAME");
        if (currentTableName.equalsIgnoreCase(tableName))
        {
            //...Your code goes here.
        }
    }
} 
catch(SQLException e)
{
    LOGGER.log(Level.SEVERE, e.getMessage(), e);
} 
finally 
{
    DbUtils.closeQuietly(rs); // Apache Commons DbUtils
}
person Lion    schedule 07.01.2012

В строке «MYENERGYAPP.ENERGYTABLE7» «MYENERGYAPP» — это Имя схемы, а «ENERGYTABLE7» — это Имя таблицы.

Похоже, вы передаете всю строку в аргумент tableName вызова DatabaseMetaData.getColumns().

Попробуйте передать имя схемы в аргумент "schemaName" (второй аргумент для getColumns()) и передать имя таблицы в аргумент "tableName" (третий аргумент ).

См. http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/DatabaseMetaData.html#getColumns(java.lang.String, java.lang.String, java.lang.String, java.lang.String)

person Bryan Pendleton    schedule 07.01.2012