【问题标题】:ResultSet not open. Operation GetMetaData is not allowed结果集未打开。不允许操作 GetMetaData
【发布时间】: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())

标签: java swing derby


【解决方案1】:

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

我的意思是,resultset 是指向在 executeQuery() 中定义的对象的指针,然后您在 execute(query) 中隐式地重新定义结果集。

那是因为您要查询两次。

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

【讨论】:

    【解决方案2】:

    里奥是对的。 MetaData 对象来自第一个在您重新执行查询时关闭的 ResultSet。不要执行两次查询,或者如果必须执行,请确保从实际导航的结果集中获得“新鲜”的 MetaData 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 2018-06-07
      • 1970-01-01
      • 2011-06-06
      • 2021-08-18
      相关资源
      最近更新 更多