JDBC 调用中的参数无效:参数索引超出范围(使用 Ucanaccess)

Posted

技术标签:

【中文标题】JDBC 调用中的参数无效:参数索引超出范围(使用 Ucanaccess)【英文标题】:Invalid argument in JDBC call: parameter index out of range (Using Ucanaccess) 【发布时间】:2019-06-22 18:40:18 【问题描述】:

我正在创建一个包含来自 java 的练级系统的游戏。到目前为止,我一直在使用 Ucanaccess 读取用户当前的等级和经验(0-100)。

我正在写一个代码,使用if语句,说明当用户的经验条在100或超过100时,它会选择用户当前的等级,他们会升级一个等级,以及扣除额外的经验值超过100并转移到新的水平。 (如果 exp = 129,则新 exp = 129-100)。

这是我的 if 语句代码:

if (exp >= 100)

    try
    
        Connection conn = DriverManager.getConnection("jdbc:ucanaccess://C:\\Users\\evanc\\Documents\\NetBeansProjects\\IT PAT task\\IT PAT DataBase\\userDB.accdb");
        String query = "SELECT * FROM [tblUser] WHERE username = " + "'" + User.getInstance().username + "'";
        PreparedStatement pst = conn.prepareStatement(query);
        ResultSet rs = pst.executeQuery();
        rs.next();
        String newLevel = Integer.toString(User.getInstance().level + 1) ;
        String updateQuery = "UPDATE tblUser SET (level) = (?) WHERE username=" + "'" + rs.getString("username") + "'";

        PreparedStatement st = conn.prepareStatement(updateQuery);
        st.setString(5,newLevel);
        st.executeUpdate();
        lblLevel.setText("lvl: " + Integer.toString(User.getInstance().level));

        int newExp = exp - 100;
        exp = newExp;
        exp = User.getInstance().experience;
        expBar.setValue(User.getInstance().experience);    
    
    catch(Exception e)
    
        System.err.println("Exception occured: ");
        System.err.println(e.getMessage());   
    

    JOptionPane.showMessageDialog(null, "Congratulations! You leveled up!");

这是它显示的错误: “发生异常: UCAExc:::4.0.4 JDBC 调用中的参数无效:参数索引超出范围:5"

我正在尝试更新我的数据库的第 5 列,称为“级别”。

如果有任何帮助,我将不胜感激!

【问题讨论】:

为什么你对一个参数使用占位符而不对第二个参数使用占位符?将列名或参数放在括号之间也是完全没用的,set level = ? where ... 可以正常工作 【参考方案1】:

首先:您的代码中有一个额外的,我编辑了您的问题并将其删除。

第二,真正的问题。

您的查询是:

String updateQuery = "UPDATE tblUser SET (level) = (?) WHERE username=" + "'" + rs.getString("username") + "'";

然后你准备它:

PreparedStatement st = conn.prepareStatement(updateQuery);

所以一旦准备好,对象 st 就有 1 个参数可用。将替换查询中的 ? 标记的值。 st 不知道 ? 的替换实际上是数据库中的第 5 个元素。从它的角度来看,它只等待 1 个参数。

当您想在查询中为? 设置一个值时,它是第一字段。所以你的代码应该是:

st.setString(1,newLevel);

查看此页面:https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html 它向您展示了一个带有多个 ? 的准备好的语句示例。您将在查询中看到两个?。所以他们必须设置12的值。


还有一点,我不明白你为什么要把 (level + 1) 转换成字符串。您可以使用st.setInt(1, newLevel) 并保留所有数字。你的来电。只要确保数据库中字段的数据类型也是整数即可。

【讨论】:

WHERE 子句的用户名也应该作为参数传递,而不是连接到 SQL 字符串中。

以上是关于JDBC 调用中的参数无效:参数索引超出范围(使用 Ucanaccess)的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:spring boot中的参数索引超出范围(6>参数个数,即5)

SQL []; 索引 1 超出范围。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 索引 1 超出范围。]

为啥此代码显示参数索引超出范围异常? [复制]

无效的过程调用或参数

参数索引超出范围(4 > 参数个数,即 3)

ORA-21560: 参数 2 为空、无效或超出范围