错误:参数索引超出范围(2>参数个数,即1)

时间:2017-04-04 16:33:47

标签: java mysql sql eclipse interface

我在这里搜索找到我的错误的解决方案,但没有人匹配我的问题,所以是否有人帮我在我的代码中找到错误!?

 textField_1.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {

            try{
            Object selected = list_1.getSelectedValue();
                Connection conn = null;
                conn=DriverManager.getConnection("jdbc:mysql://localhost/flyer","root","000");
                Statement st= conn.createStatement();

                String query = "INSERT INTO flyer_item (discount) SELECT price*? FROM `item` where item_name='?' ";

                // PreparedStatement ps = null;

                int i = Integer.valueOf((textField_1.getText()));
                i=i/100;
                java.sql.PreparedStatement ps = conn.prepareStatement(query);
                ps.setInt(1,i);
                ps.setString(2, selected.toString());
                ps.executeUpdate();
                st.executeUpdate(query);



            } catch (SQLException se){
                System.out.println(se.getMessage());

            }

                            } } );

注意:mysql语句在工作台中成功运行。 谢谢

2 个答案:

答案 0 :(得分:1)

删除问号占位符周围的单引号

改变这个:

  where item_name='?'

对此:

  where item_name= ?

这应解决问题。

使用单引号,prepareStatement将单引号视为包含字符串文字。字符串文字恰好包含一个问号,但它没有将该问号视为绑定占位符。

因此,生成的预处理语句只有一个占位符。这就是setString调用遇到错误的原因:没有第二个占位符为其提供值。

-

修改

同样从代码中删除此行:

            st.executeUpdate(query);

并删除此行:

            Statement st= conn.createStatement();

(代码正在创建并使用准备好的声明 ps 。)

答案 1 :(得分:0)

从第二个参数中删除引号。在报价内?被视为文字,而不是参数。

String query = "INSERT INTO flyer_item (discount) SELECT price*? FROM `item` where item_name=?";

类型转换将自动处理..