Java 结果集未打开。不允许操作GetMetaData

Java 结果集未打开。不允许操作GetMetaData,java,swing,derby,Java,Swing,Derby,我对一个数据库类有一些问题,我有两个方法。应该用数据库中的数据填充JTable。 问题是我收到了错误(标题)。这是我的密码: public class QueryModel { private Connection connection = null; private ResultSet resultSet = null; private Statement statement = null; private ResultSetMetaData metaData = null; public

我对一个数据库类有一些问题,我有两个方法。应该用数据库中的数据填充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);
}
公共类查询模型{
私有连接=null;
私有ResultSet ResultSet=null;
私有语句=null;
私有ResultSetMetaData元数据=null;
公共void sendStatement(CreateDataBase数据库,字符串查询)
{
尝试
{
connection=database.getConnection();
} 
catch(SQLException | ClassNotFoundException e)
{
系统错误println(e);
}
如果(!query.equals(“”)
{
尝试
{
statement=connection.createStatement();
resultSet=语句.executeQuery(查询);
metaData=resultSet.getMetaData();
if(语句执行(查询))
{
System.out.println(“结果:”);
JTable table=新的JTable(buildTableModel());
showMessageDialog(null,新的JScrollPane(表));
}
其他的
{
System.out.println(“已执行!”);
}
语句。close();
} 
捕获(SQLE异常)
{
系统错误println(e);
}
}
}
public DefaultTableModel buildTableModel()引发SQLException
{
//列名
向量列名称=新向量();
int columnCount=metaData.getColumnCount();

for(int column=1;columnLeo是正确的。元数据对象来自第一个结果集,当您重新执行查询时,该结果集将关闭。不要执行查询两次,或者如果必须执行,请确保获得“fresh”实际导航的结果集中的元数据对象。

在“if”子句中第二次执行查询时,隐式关闭第一个结果集

我的意思是,resultset是指向executeQuery()中定义的对象的指针,然后在execute(查询)中隐式地重新定义resultset

那是因为你查询了两次


尝试从if块内部定义元数据,看看它是否有效(可能有效)

您是否执行了两次查询?我只是在那里执行编辑:我的意思是,在调用此方法时,它只在那里执行。我想这不是问题所在,没有getMetaData,它就可以工作了。您介意发布stacktrace吗?在中第二次执行查询时,您是否隐式关闭了第一个resultset“if”子句?我的意思是,resultset是指向executeQuery()中定义的对象的指针,然后在execute(查询)中隐式地重新定义resultset。这是因为您要查询两次。请尝试从if块内部定义元数据,看看它是否有效(可能有效)无论如何,您不应该在这里查询两次。如果您想检查是否有结果,您的if子句应该类似于(if resultSet.next())