connection.getMetaData似乎没有返回表信息

时间:2012-01-07 14:39:22

标签: 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".
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]; 
    } 
}

3 个答案:

答案 0 :(得分:2)

尝试仅使用表格的名称;当我这样做时,我不需要将'app'级别的名称放在表名前面(即只是EVERYGYTABLE7)。并确保表名具有该大小写;可以创建一个带有大小写混合名称的表,我认为Derby对此非常严格。

答案 1 :(得分:0)

我对你的问题很不清楚。首先,尝试将您的表存在(忽略大小写),就像下面提到的那样。

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
}

答案 2 :(得分:0)

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

看起来您将整个字符串传递给DatabaseMetaData.getColumns()调用的“tableName”参数。

尝试将架构名称传递给“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)