如何修复:Java 中的“参数索引超出范围1 > 参数数量,为 0”错误?

问题描述

我正在尝试学习 JDBC 事务,我编写了一些基本代码来测试它。但是,当我运行代码时,输​​出中显示了一些错误。任何人都可以帮助我为什么会发生这种情况以及如何摆脱这种情况?

这是代码

public class JDBCTransactionExample {

    private static String db_url = "jdbc:MysqL://localhost:3306/test";
    private static String db_user = "root";
    private static String db_password = "root";

    private static final String INSERT_INTO_USER = "INSERT INTO user VALUES(?,?,?);";
    private static final String UPDATE_USER = "UPDATE user SET name = ? WHERE id = ?;";

    public static void main(String[] args) {

        Connection conn = null;
        try {
            Class.forName("com.MysqL.cj.jdbc.Driver");
            conn = DriverManager.getConnection(db_url,db_user,db_password);
            conn.setAutoCommit(false);

            try {
                PreparedStatement insertStmt = conn.prepareStatement("INSERT_INTO_USER");
                PreparedStatement updateStmt = conn.prepareStatement("UPDATE_USER");

                // Create insert statement
                insertStmt.setInt(1,4);
                insertStmt.setString(2,"BBB");
                insertStmt.setString(3,"bbb@gmail.com");
                insertStmt.setString(4,"en");
                insertStmt.setString(5,"7894");
                insertStmt.executeUpdate();

                // Create update statement
                updateStmt.setString(1,"AAA");
                updateStmt.setInt(2,4);
                updateStmt.executeUpdate();

                // STEP 2 - Commit insert and update statement
                conn.commit();
                System.out.println("Transaction is commited successfully.");

            } catch (sqlException e) {
                e.printstacktrace();
                if (conn != null) {
                    try {
                        // STEP 3 - Roll back transaction
                        System.out.println("Transaction is being rolled back.");
                        conn.rollback();

                    } catch (Exception ex) {
                        ex.printstacktrace();
                    }
                }
            }
        } catch (Exception e) {
            e.printstacktrace();
        }
    }
}

输出如下:

java.sql.sqlException: Parameter index out of range (1 > number of parameters,which is 0).Transaction is being rolled back.
at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:129)
at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:97)
at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:89)
at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:63)
at com.MysqL.cj.jdbc.ClientPreparedStatement.checkBounds(ClientPreparedStatement.java:1372)
at com.MysqL.cj.jdbc.ClientPreparedStatement.getCoreParameterIndex(ClientPreparedStatement.java:1385)
at com.MysqL.cj.jdbc.ClientPreparedStatement.setInt(ClientPreparedStatement.java:1573)
at jdbc.transaction.JDBCTransactionExample.main(JDBCTransactionExample.java:29)

解决方法

我认为您打算在这里使用常量而不是 String

PreparedStatement insertStmt = conn.prepareStatement("INSERT_INTO_USER");
PreparedStatement updateStmt = conn.prepareStatement("UPDATE_USER");

应该

PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_USER);
PreparedStatement updateStmt = conn.prepareStatement(UPDATE_USER);
,
private static final String INSERT_INTO_USER = "INSERT INTO user VALUES(?,?,?);";
private static final String UPDATE_USER = "UPDATE user SET name = ? WHERE id = ?;";

看看你的字符串,符号 ; 是多余的,应该如下:

private static final String INSERT_INTO_USER = "INSERT INTO user VALUES(?,?)";
private static final String UPDATE_USER = "UPDATE user SET name = ? WHERE id = ?";
......
PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_USER);
PreparedStatement updateStmt = conn.prepareStatement(UPDATE_USER);
,

基本上这个错误与 ?在preparedStatement中(?:指的是preparedStatement的参数索引)

但是对于您的情况,您已经将 sql 查询声明为字符串,因此您不需要双引号,您只需要调用 CONST UPDATE_USER 和 UPDATE_USER !

使用: PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_USER); PreparedStatement updateStmt = conn.prepareStatement(UPDATE_USER);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...