Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 即使PreparedStatement正在关闭,也要使用clearParameter()_Sql_Jdbc_Connection_Resultset - Fatal编程技术网

Sql 即使PreparedStatement正在关闭,也要使用clearParameter()

Sql 即使PreparedStatement正在关闭,也要使用clearParameter(),sql,jdbc,connection,resultset,Sql,Jdbc,Connection,Resultset,以上是给定的InsertInDB方法, 它有一个InsertPS PreparedStatement对象。 在这里,即使我在方法末尾关闭InsertPS对象,也必须使用clearParameters方法。 我提供了一个单独的方法来关闭连接对象 还有另一个问题:在类中的任何方法之外创建PreparedStatement对象,使用构造函数初始化,例如,使用不同方法中的所有对象后,使用单独的方法关闭所有PreparedStatement对象,这是一个好主意吗 private PreparedState

以上是给定的InsertInDB方法, 它有一个InsertPS PreparedStatement对象。 在这里,即使我在方法末尾关闭InsertPS对象,也必须使用clearParameters方法。 我提供了一个单独的方法来关闭连接对象

还有另一个问题:在类中的任何方法之外创建PreparedStatement对象,使用构造函数初始化,例如,使用不同方法中的所有对象后,使用单独的方法关闭所有PreparedStatement对象,这是一个好主意吗

private PreparedStatement InsertPS = null;
public boolean InsertInDB(String username, String password, double balance, String secret) {
    boolean ans = false;
    try {
        InsertPS = con.prepareStatement("Insert into BankDB values(?,?,?,?)");
        String data[] = AMC.SendtoDB(password, secret);
        InsertPS.setString(1, data[0]);
        InsertPS.setString(2, username);
        InsertPS.setString(3, data[1]);
        InsertPS.setDouble(4, balance);
        int rows = InsertPS.executeUpdate();
        if (rows != 0) {
            ans = true;
        }
        InsertPS.clearParameters();
    } catch (SQLException sqlInite) {
        System.out.println("SQL Error in InsertInDB method: " + sqlInite);
    } finally {
        try {
            InsertPS.close();
        } catch (SQLException sqle) {
            System.out.println("SQL Exception in InsertInDB method finally clause : " + sqle);
        }
    }
    return ans;
}

欢迎对代码的其他方面提出建议或批评。

对于第一个问题,当您致电:

    public class JavatoDB {

    Driver DM = null;
    Connection con = null;
    PreparedStatement InsertPS = null;
    PreparedStatement BalancePS = null;
    PreparedStatement DeletePS = null;
    PreparedStatement UpdatePS = null;
    PreparedStatement SearchDB = null;
    ResultSet RS = null;
    ResultSetMetaData RSMD = null;
    AdminControl AMC = null;


    public JavatoDB() {
        AMC = new AdminControl();
        try {
            DM = new com.mysql.jdbc.Driver();
            con = DriverManager.getConnection("jdbc:mysql://localhost/javadb", "java", "javaaccess");
            InsertPS = con.prepareStatement("Insert into BankDB values(?,?,?,?)");
            BalancePS = con.prepareStatement("Select BALANCE from BankDB where ACCNAME=? AND ACCPIN = ?");
            DeletePS = con.prepareStatement("Delete from BankDB where ACCNAME = ? AND ACCPIN = ? ");
            UpdatePS = con.prepareStatement("Update  BankDB set BALANCE = (BALANCE + ?) where ACCNAME = ? AND ACCPIN = ?");
            SearchDB = con.prepareStatement("Select ID AND ACCPIN from BankDB where ACCNAME = ? ");
        } catch (SQLException JavatoDBContrsuctor) {
            System.out.println("SQL Error in JavatoDBConstructor: " + JavatoDBContrsuctor);
        }
    }


    public boolean InsertInDB(String username, String password, double balance, String secret) {
        boolean ans = false;
        try {
            String data[] = AMC.SendtoDB(password, secret);
            InsertPS.setString(1, data[0]);
            InsertPS.setString(2, username);
            InsertPS.setString(3, data[1]);
            InsertPS.setDouble(4, balance);

            int rows = InsertPS.executeUpdate();
            if (rows != 0) {
                ans = true;
            }
            InsertPS.clearParameters();
        } catch (SQLException sqlInite) {
            System.out.println("SQL Error in InsertInDB method: " + sqlInite);
        }
        return ans;
    }
一个新的preparedStatement被创建,然后参数就不存在了,我的意思是你不需要清除它

关于第二个问题,在您的实现中,我看不到在哪里关闭preparedStatement,如果只添加close,下次方法将失败。然后,通常创建preparedStatement并用相同的方法关闭它

con.prepareStatement()