当前位置:编程学习 > JAVA >>

请大侠帮我看下数据库分页的sql语句有什么问题。。。


private List<User> findUserList(int pageNum,int pageSize){

DBInfo db = this.getDBInof();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from" +
"{select user_info.* rownum rn from" +
"{select * from user_info where user_id<>'root' order by user_id}" +
"where rownum<=?}" +
      "where rn>? ";
/*String sql = "select rownum rn,user_info.* from" +
"{select *  from user_info where user_id<>'root'order by user_id}" +
"where rn<=? and rn>?";*/
List<User> list = new ArrayList<User>();


try{
Class.forName(db.getDriverName());
}catch(ClassNotFoundException e){
e.printStackTrace();
}


try{
conn = DriverManager.getConnection(db.getUrl(),db.getUserName(),db.getPassword());
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, pageSize*pageNum);
pstmt.setInt(2, (pageNum-1)*pageSize);
rs = pstmt.executeQuery();
while(rs.next()){
User user = new User();
user.setUserId(rs.getInt("user_id"));
user.setUserName(rs.getString("user_name"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
user.setContactTel(rs.getString("contact_tel"));
user.setCreateDate(rs.getTimestamp("create_date"));

list.add(user);

}

}catch(SQLException e){
System.out.println("------------------findUserList----------------");
e.printStackTrace();
}finally{
if(rs!=null){
try{
rs.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(pstmt!=null){
try{
pstmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
return list;
}

报错信息:

java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2569)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2600)
at com.mysql.jdbc.PreparedStatement.setInt(PreparedStatement.java:2551)
at cn.nuaa.web.sysmgr.manager.UserManagerIMP.findUserList(UserManagerIMP.java:127)
at cn.nuaa.web.sysmgr.manager.UserManagerIMP.findPageModel(UserManagerIMP.java:219)
at cn.nuaa.web.test.Test.main(Test.java:21)


另外,代码中您看到任何不好的地方都请说说。。晚辈真心求帮助。。谢谢。。。 --------------------编程问答-------------------- 自己顶。。。。。。。。。。。 --------------------编程问答-------------------- 最后一顶。。哪个大哥来帮我看下啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 --------------------编程问答-------------------- 对不起,俺学识有限,帮不了你    ~~~~(>_<)~~~~  --------------------编程问答--------------------
引用 3 楼 lishangliandie 的回复:
对不起,俺学识有限,帮不了你    ~~~~(>_<)~~~~
谢了。。我又可以自己顶自己帖子了。。。 --------------------编程问答-------------------- 这语句,看着蛋疼 --------------------编程问答--------------------
引用 5 楼 kkccblk 的回复:
这语句,看着蛋疼
这样写代码有什么问题么?
框架太多东西学不到了,所以我才不用框架回去打基础的。。。 --------------------编程问答-------------------- Parameter index out of range (2 > number of parameters, which is 1).
明显是你的 索引越界 --------------------编程问答-------------------- 自顶。。谁来看啊谁来看啊。。。。。。。。 --------------------编程问答-------------------- 是用的oracle数据库吧,网上搜搜分页,然后再看看你的语句。
感觉上你的where语句有点we提。 --------------------编程问答-------------------- 晕,最后2个字应该是问题,最近打字老是错。 --------------------编程问答-------------------- {select user_info.* rownum rn from" +
                    "{select * from user_info where user_id<>'root' order by user_id}" +
                "where rownum<=?}" +
                  "where rn>? ";
怎么是大括号?报错是说,你只有一个参数,而你传了2个过去。 --------------------编程问答-------------------- conn = DriverManager.getConnection(db.getUrl(),db.getUserName(),db.getPassword());
            pstmt = conn.prepareStatement(sql);
            [color=#FF0000pstmt.setInt(1, pageSize*pageNum);
            pstmt.setInt(2, (pageNum-1)*pageSize);
][/color]
            rs = pstmt.executeQuery();


你就2个参数,不应该从0开始设置吗? 为什么是从1开始的呢 --------------------编程问答-------------------- 你这sql真蛋疼,你这条sql要也应该是这样的:
select * from (select u_table*,rownum rn from(select * from user_info u_table where user_id<>'root' order by user_id)) where rn<=? and rn>?; --------------------编程问答-------------------- 写错了 我日 太久没写了
select * from (select u_table.*,rownum rn from(select * from user_info u_table where user_id<>'root' order by user_id) where rn<=? and rn>?); --------------------编程问答-------------------- 又错了 谁能把我上面的删掉
select * from (select u_table.*,rownum rn from(select * from user_info  where user_id<>'root' order by user_id) u_table where rn<=? and rn>?); --------------------编程问答-------------------- 蛋疼的语句 --------------------编程问答-------------------- 有两种可能:
1) sql语句。感觉楼主的sql语句挺别扭,不过我没环境不好测,楼主可以试试在mysql控制台先运行下语句。或者试试楼上朋友的sql;
2) 同一个PreparedStatement对象被几个方法调用但是没有及时释放使得pstmt不能新建也会导致这种异常;

http://www.coderanch.com/t/307234/JDBC/java/java-sql-SQLException-Parameter-index 尾贴 --------------------编程问答-------------------- 明确错误位置:
cn.nuaa.web.sysmgr.manager.UserManagerIMP.findUserList(UserManagerIMP.java:127)
明确错误原因:
Parameter index out of range (2 > number of parameters, which is 1).

明显你的参数有问题导致127行代码的错误。应该很容易发现问题。

看懂异常信息是需要时间和经验的累积,但是不管是简单或是复杂的异常信息都要有意识的去慢慢读 --------------------编程问答-------------------- {}换成() 在实施!! --------------------编程问答-------------------- sql语句中有问题。。。
你的语句
 String sql = "select * from" +
                "{select user_info.* rownum rn少一个","号,而且别名user_info不对,你的语句根本没有别名 from" +
                    "{select * from user_info where user_id<>'root' order by user_id}" +
                "where rownum<=?}" +
                  "where rn>? ";

正确的是:   
String sql = "select * from (select ui.*, rownum rn from (select * from user_info where user_id<>'root' order by user_id) ui where rownum<=?) where rn>? ";

--------------------编程问答-------------------- 报错的原因由此就是: 你的语句不对,导致你的"?"号参数只有一个在括号中,另外一个参数"?"由于语句拼接错误而在括号外,程序无法读到第二个参数,而程序就认为你只有一个参数【在语句中】,所以最终出来的错误是,你明明是两个参数,设置的两个参数也是正确的,但错误仍然说你多设置一个参数! --------------------编程问答-------------------- 楼主这代码写的不需要封装的你封装了,需要封装的你没有,导致代码可读性以及代码量没有达到预定的效果
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,