【发布时间】:2014-03-17 22:23:11
【问题描述】:
我遇到了一个数据库类的问题,我有两个方法。那应该用数据库中的数据填充 JTable。 问题是我收到错误(标题)。这是我的代码:
public class QueryModel {
private Connection connection = null;
private ResultSet resultSet = null;
private Statement statement = null;
private ResultSetMetaData metaData = null;
public void sendStatement(CreateDataBase database,String query)
{
try
{
connection = database.getConnection();
}
catch (SQLException | ClassNotFoundException e)
{
System.err.println(e);
}
if (!query.equals(""))
{
try
{
statement = connection.createStatement();
resultSet = statement.executeQuery(query);
metaData = resultSet.getMetaData();
if (statement.execute(query))
{
System.out.println("Result:");
JTable table = new JTable(buildTableModel());
JOptionPane.showMessageDialog(null, new JScrollPane(table));
}
else
{
System.out.println("Executed!");
}
statement.close();
}
catch (SQLException e)
{
System.err.println(e);
}
}
}
public DefaultTableModel buildTableModel() throws SQLException
{
// names of columns
Vector<String> columnNames = new Vector<String>();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
columnNames.add(metaData.getColumnName(column));
// data of the table
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (resultSet.next())
{
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++)
vector.add(resultSet.getObject(columnIndex));
data.add(vector);
}
return new DefaultTableModel(data, columnNames);
}
}
在我看来,问题似乎是 getMetaData 函数,没有这个,每个查询都会顺利进行。当我添加这个时问题开始了。我还没有使用这个,所以我不知道如何处理这个,不知道是否有任何感觉尝试修复它而不是用其他方式。喜欢更多手动。
【问题讨论】:
-
您是否执行了两次查询?
-
我只是在那里执行它编辑:我的意思是在我调用这个方法时它只在那里执行。我猜这不是问题所在,没有 getMetaData 它可以工作。
-
您介意发布堆栈跟踪吗?
-
在“if”子句中第二次执行查询时不是隐式关闭第一个结果集吗?我的意思是,resultset 是指向在 executeQuery() 中定义的对象的指针,然后您在 execute(query) 中隐式地重新定义结果集。那是因为您要查询两次。尝试从 if 块中定义元数据,看看它是否有效(可能会)
-
反正这里不要查询两次。如果你想检查是否有结果,你的 if 子句应该类似于 (if resultSet.next())