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