Java connection.getMetaData似乎不返回表信息

Java connection.getMetaData似乎不返回表信息,java,eclipse,derby,Java,Eclipse,Derby,我正在使用一个简单的应用程序帮助学习Apache.Derby中的数据库,并在Eclipse中工作。 以下代码运行正常,但conn.getMetaData不会返回任何与表相关的有意义的内容-例如,colnameslist.size为0。不过,我添加了meta.getDatabaseProductName来查看发生了什么,它返回“Apache.Derby”,所以我想可能存在某种连接 The connection url is "jdbc:derby:C:/Users/RonLaptop/MyDB".

我正在使用一个简单的应用程序帮助学习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]; 
    } 
}

尝试只使用表的名称;当我这样做时,我不需要将“app”级别的名称放在表名的前面,即EVERYGYTABLE7。并确保表名的大小写相同;创建一个混合大小写名称的表是可能的,我认为Derby在这方面很严格。

我只是不太清楚您的问题。首先,如果您的表存在,请尝试忽略如下所述的大小写

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
}

在字符串MYENERGYAPP.ENERGYTABLE7中,MYENERGYAPP是架构名,ENERGYTABLE7是表名

看起来您正在将整个字符串传递到DatabaseMetaData.getColumns调用的tableName参数中

尝试将Schema名称传递给schemaName参数作为getColumns的第二个参数,并将表名传递给tableName参数作为第三个参数


请参见,java.lang.String,java.lang.String,java.lang.String

请重新表述您的问题。这段代码有什么问题?很抱歉,我没有把问题说清楚。我无法收集数据库信息-列名称、类型和值,但没有提供线索的错误。然而,下面的rcook答案解决了它-案例敏感度。谢谢-案例敏感度治愈了它!我确实发现sql语句中需要“app”级别。