SELECT查询不传递参数

时间:2018-02-05 09:49:15

标签: mysql

我有一个带内连接的select查询,而where子句位于第二个Query中,

以下是代码:

static String Showplan = "SELECT * From plan_audit INNER JOIN (SELECT Du,Au From Programme_audit Where Du = '?' AND Au = '?')AS T ";

public void buttonClick(ClickEvent event) {
                        try{
                            Class.forName("com.mysql.jdbc.Driver");
                            Core.con = DriverManager.getConnection(Core.db,Core.dbUsername,Core.dbPassword);
                            PreparedStatement st;
                            st = Core.con.prepareStatement(Core.Showplan);
                            st.setString(1,select.getValue().toString());
                            st.setString(2,select1.getValue().toString());
                            ResultSet rs = st.executeQuery();

                            while(rs.next()){
                                table.addItem(new Object[]{rs.getInt(1),rs.getString(2),rs.getDate(3),rs.getString(4), rs.getString(5),rs.getString(6),rs.getString(7),rs.getString(8),rs.getDate(9),rs.getString(10),rs.getString(11),rs.getDate(12),rs.getString(13),rs.getString(14),rs.getString(15)},rs.getInt(1));

                            }
                        }catch(Exception e){
                            e.printStackTrace();
                        }

                    }


            });

,引发的异常如下:

  

java.sql.SQLException:参数索引超出范围(1>数   参数,即0)。

2 个答案:

答案 0 :(得分:0)

请勿在参数标记?后添加单引号。实际上,不要对它们执行任何,而是让Java按其认为合适的方式插入数据:

String sql = "SELECT * From plan_audit INNER JOIN ";
sql += "(SELECT Du, Au From Programme_audit Where Du = ? AND Au = ?) t ";
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, select.getValue().toString());
st.setString(2, select1.getValue().toString());
ResultSet rs = st.executeQuery();

准备语句的重点是让Java担心如何将数据引入查询。在这种情况下,由于您绑定字符串,它们将被单引号括起来,但您不需要关心它。

作为旁注,您的查询实际上是在进行交叉连接,因为您从未指定连接条件。这可能是也可能不是你想要的,但很可能你想在这里有某种加入条件。

答案 1 :(得分:0)

您是否尝试过参数索引0和1而不是1和2?

st.setString(0,select.getValue().toString());
st.setString(1,select1.getValue().toString());

单引号是正确的。

相关问题