【问题标题】:Parameter index out of range (0 < 1)参数索引超出范围 (0 < 1)
【发布时间】:2020-06-07 13:16:26
【问题描述】:

我知道这个问题已经在 stackoverflow 上被问过很多次了,但是我仍然无法确定我的代码无法正常工作的确切原因。

这是查询:

String QUERY = "INSERT INTO orders (user, product_id, final_price, key_id) VALUES (?, ?, ?, ?)"; 

使用我在失败的函数中使用的相同参数手动运行查询效果很好。

这是preparedStatement:

// ...more code up here...
PreparedStatement preparedStatement = connectionManager.databaseConnection.prepareStatement(QUERY);

preparedStatement.setInt(1, user_id);
preparedStatement.setInt(2, product_id);
preparedStatement.setFloat(3, _finalprice);
// ...more code down there...
preparedStatement.setInt(4, _keyid);

我得到的错误如下:

java.sql.SQLException: Parameter index out of range (0 < 1 ).

我用相同的技术完成了其他几个 INSERT,它们都完美地工作,我开始认为我正在使用的 mysqlconnector 存在一些问题 (mysql-connector-java-8.0.19)。

上下文的完整代码:

private static boolean assignProduct(int product_id, int user_id)
{
    String QUERY = "INSERT INTO orders (user, product_id, final_price, key_id) VALUES (?, ?, ?, ?)"; 
    
    float _finalprice = 0;
    int _discount = 0;
    int _keyid = 0;
    
    if(product_id <= 0 || user_id <= 0) {return false;} 
    
    Product _p;
    try {
        _p = Product_utils.productByID(product_id);
    
        if(_p != null)
        {
            _finalprice = _p.getPrice();
            _discount = _p.getDiscount();
        
            if(_discount > 0)
            {
                _finalprice = _finalprice - (_finalprice * _discount / 100);
            }
        }else { return false;}
    
        PreparedStatement preparedStatement = connectionManager.databaseConnection.prepareStatement(QUERY);

        
        preparedStatement.setInt(1, user_id);
        preparedStatement.setInt(2, product_id);
        preparedStatement.setFloat(3, _finalprice);
    
        _keyid = retriveKey(product_id);
    
        if(_keyid == 0) { return false; } 
    
        preparedStatement.setInt(4, _keyid);
    
        if(preparedStatement.executeUpdate() == 1) {return true;} else {return false;} 
    
    } catch (SQLException e) { System.out.println(e.toString()); return false;}
}

【问题讨论】:

  • 在什么情况下它不起作用?你有错误吗?订单表没有更新吗?
  • edit 提供您遇到的确切错误,并提供minimal reproducible example 来说明问题。
  • java.sql.SQLException:参数索引超出范围 (0
  • 我怀疑你认为你正在运行的代码并不是你实际运行的。我会在导致异常的行上设置一个断点(或者设置一个断点异常,如果可以的话)并查看该点的语句。
  • 我可以确认问题存在。现在我将添加完整的代码,我还使用了断点和变量观察器,user_id、product_id、_finalprice 和 _keyid 值是正确的。

标签: java mysql servlets


【解决方案1】:

通过将我的 mysql 连接器升级到 8.0.20 解决

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多