【问题标题】:ResultSet to jTable = java.sql.SQLException: The prepared statement has been finalizedResultSet to jTable = java.sql.SQLException: Prepared statement has been finalized
【发布时间】:2017-11-16 17:06:46
【问题描述】:

StackOverFlow 的朋友!

我尝试在 select 语句中“返回”一个 ResultSet 并有错误... 我在 Google 和 StackOverFlow 中搜索,但没有解决这个问题!

语句插入工作正常!但是选择不起作用...

数据库层:

package Database;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DBConnection {
    private static Connection               conn = null;
    private static ResultSet                rs = null;
    private static Statement                stmt = null;
    private static PreparedStatement        pst = null;

    private static final String             DATABASE_PATH_NAME="jdbc:sqlite:MiraReal.Xitano";

    private Connection Connect()
    {
        try
        {
            Class.forName("org.sqlite.JDBC");

            conn                            = DriverManager.getConnection(DATABASE_PATH_NAME);

            return conn;
        }
        catch (Exception ex)
        {
            Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);

            return null;
        }
    }

    public boolean RunQuery(String sql)
    {
        Statement                           stmt;
        try {
            Connect();

            stmt                            = conn.createStatement();

            stmt.execute(sql);

            Disconnect();

            return true;

        } catch (SQLException ex) {
            Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
        // create a new table
    }

    public ResultSet RunSelect(String sql){
        try {
            Connect();

            stmt                            = conn.createStatement();

            rs                              = stmt.executeQuery(sql);
            //rs..moveToFirst();
            Disconnect();
        } catch (SQLException ex) {
            Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
        }
        return rs;
    }

    public int RunCount(String sql, String where)
    {
        return 1;
    }

    private void Disconnect()
    {
        try 
        {
            DBConnection.conn.close();
            DBConnection.conn               = null;
        } catch (SQLException ex) {
            Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

动作层:

package Actions;

import Models.CustomersModels;
import java.sql.ResultSet;
import java.util.logging.Logger;

public class CustomersActions extends CustomersModels {
    protected String sqlInsert = "INSERT INTO customers (uuid, fullname, email, created_at, updated_at) VALUES ('%s', '%s', '%s', '%s', '%s') ";
    protected String sqlUpdate = "UPDATE customers SET fullname='%s' WHERE uuid='%s'";
    protected String sqlDelete = "DELETE FROM customers WHERE uuid='%s'";
    protected String sqlSelect = "SELECT %s FROM customers %s %s %s";

    public boolean insert()
    {
        String sql = String.format(sqlInsert, this.getUuid(), 
                this.getFullname(), this.getEmail(), this.getCreatedAt(), 
                this.getUpdatedAt());

        return this.RunQuery(sql);
    }

    public boolean update()
    {
        String sql = String.format(sqlUpdate, this.getFullname(), this.getUuid());

        return this.RunQuery(sql);
    }

    public boolean delete()
    {
        String sql = String.format(sqlDelete, this.getUuid());

        return this.RunQuery(sql);
    }

    public ResultSet select(String columns, String where, String order, String limit)
    {
        String sql = String.format(sqlSelect, columns, where, order, limit);

        System.out.println(sql);

        return this.RunSelect(sql);
    }

}

尝试使用它(使用 net.proteanit.sql.DbUtils 将结果集设置为 jTable):

Customers customers = new Customers();

        String customersColumns = "*";
        String customersWhere = "";
        String customersOrder = "";
        String customersLimit = "";

        ResultSet dsCustomers = customers.select(customersColumns, customersWhere, customersOrder, customersLimit);

        this.jTable1.setModel(DbUtils.resultSetToTableModel(dsCustomers));

错误:

run:
SELECT * FROM customers   
java.sql.SQLException: The prepared statement has been finalized
    at org.sqlite.core.NativeDB.throwex(NativeDB.java:471)
    at org.sqlite.core.NativeDB.column_name_utf8(Native Method)
    at org.sqlite.core.NativeDB.column_name(NativeDB.java:232)
    at org.sqlite.jdbc3.JDBC3ResultSet.getColumnName(JDBC3ResultSet.java:721)
    at org.sqlite.jdbc3.JDBC3ResultSet.getColumnLabel(JDBC3ResultSet.java:714)
    at net.proteanit.sql.DbUtils.resultSetToTableModel(DbUtils.java:21)
    at Frames.MiraReal.seederCustomers(MiraReal.java:142)
    at Frames.MiraReal.<init>(MiraReal.java:37)
    at Frames.MiraReal$2.run(MiraReal.java:177)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Frames.MiraReal.seederCustomers(MiraReal.java:142)
    at Frames.MiraReal.<init>(MiraReal.java:37)
    at Frames.MiraReal$2.run(MiraReal.java:177)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)

我在做什么?

谢谢!

【问题讨论】:

  • 这不是您编写 PreparedStatement 的方式。我不知道“%s”是干什么用的。使用 PreparedStatement 时,您使用“?”设置参数。然后使用 setXXX(...) 语句为这些参数提供值。 I Search in Google and StackOverFlow - 好吧,您需要再次搜索,因为有很多示例显示了使用 PreparedStatement 的正确方法。只需使用“PreparedStatement”作为搜索关键字,我相信您会找到示例。
  • 我在 Actions 层中使用 %s... 这在 PreparedStatement 中没有使用!我将它交付到数据库层(RunSelect)!是否可以在没有 PreparedStatement 的情况下进行选择查询?
  • PreparedStatment 可以更轻松地创建 SQL 语句,从而通过使用不正确的分隔符等减少语法错误。
  • 你为什么不回答这个问题?如果您不知道或不想帮助,您不必浪费时间打扰!谢谢你,朋友!
  • 我看到了一条错误消息prepared statement has been finalized。我以前从未见过那条消息,所以我不知道它到底是什么。但是,当我查看您的代码时,我注意到您没有正确使用PreparedStatement,因此第一个建议显然是修复该语句,看看是否有帮助。这是作为评论提出的,而不是让您思考的答案。太糟糕了,你不欣赏人们所做的努力。

标签: java swing sqlite jdbc


【解决方案1】:

请仔细阅读StatementPreparedStatement 的超类)的 Javadoc。

注意:当一个Statement对象被关闭时,它当前的ResultSet对象,如果存在的话,也被关闭。

发生的情况是PreparedStatementRunQuery 中声明,并且在该方法结束时超出范围,此时ResultSet 不再有效。

您无法按照当前的方式构建代码。 PreparedStatement 必须在使用ResultSet 的执行范围内定义。

【讨论】:

  • RunSelect 需要返回一个带有 Select(客户)的列表...有或没有语句,有或没有结果集...我需要准备一个列表并在此列表中插入 ResultSet 的内容然后我返回列表?我是怎么做到的?有人可以帮助我吗?
  • 在 JavaSE 中可能吗?
猜你喜欢
  • 2015-01-16
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多