我有一个带内连接的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)。
答案 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());
单引号是正确的。