2012-01-07 14 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

+0

申し訳ありませんが、私は問題を明確にしませんでした。私は、データベース情報(colの名前、型、値)を集めることができませんでしたが、手がかりを与えるためのエラーはありませんでした。しかし、以下のrcookの答えはそれを解決しました - 大文字小文字の区別。 – ron

答えて

2

テーブルの名前だけを使用してください。これを行うと、「アプリ」レベルの名前を表名の前に置く必要はありません(つまり、EVERYGYTABLE7のみ)。テーブル名には大文字と小文字が使用されていることを確認してください。大文字と小文字が混在したテーブルを作成することは可能ですが、Derbyはそれについて厳格だと思います。

+0

ありがとう - 感覚がそれを治した!私は、SQLステートメントで 'app'レベルが必要であることを見つけました。 – ron

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の「tableNameの」引数に文字列()の呼び出し。

(のgetColumns()に2番目の引数)「SCHEMANAME」引数にスキーマ名を渡してみて、合格のTa "tableName"引数(第3引数)に ""という名前を付けます。

参照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で)

関連する問題