2012-01-07 203 views
1

我正在使用一個簡單的應用程序來幫助Apache.Derby學習數據庫並在Eclipse中工作。 下面的代碼運行正常,但conn.getMetaData()不返回任何有意義的關於表 - colnameslist.size例如是0.但是,我添加meta.getDatabaseProductName()以查看發生了什麼,並返回'Apache.Derby'如此我想這是有某種聯繫的。connection.getMetaData似乎沒有返回表信息

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]; 
    } 
} 
+0

請重新表述您的問題。這段代碼有什麼問題? – adatapost 2012-01-07 15:09:59

+0

對不起,我沒有明確問題。我無法收集數據庫信息 - col名稱,類型和值,但沒有提供線索的錯誤。然而下面的rcook答案解決了它 - 情況敏感性。 – ron 2012-01-07 16:38:25

回答

2

嘗試使用只是表的名稱;當我這樣做時,我不需要將「應用程序」級別的名稱放在表名前(即EVERYGYTABLE7)。並確保表名具有大寫字母;有可能創建一個混合大小寫名稱的表格,我認爲德比對此非常嚴格。

+0

謝謝 - 案例敏感性治好了它!我確實發現在sql語句中需要'app'級別。 – ron 2012-01-07 16:39:37

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

在字符串 「MYENERGYAPP.ENERGYTABLE7」, 「」 MYENERGYAPP」是架構名稱,而 「ENERGYTABLE7」 是表名稱

它看起來像你逝去的整個串入的DatabaseMetaData.getColumns的「表名」的說法()調用。

嘗試傳遞模式名稱進入「SCHEMANAME」參數(第二個參數getColumns()),並通過鉭ble將命名爲「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中)

相關問題