<%@ page contentType="text/html;charset=GB2312"%>
<%@ page import="java.sql.*"%>
<%! int n=0;//总记录数
    int pagesize=5;//每页显示记录数
int pagecount;//总页数
int curentpage;//当前页
String strpage;//获取参数
    Connection con;
Statement st;
ResultSet rs;
    ResultSet rs2;
%>
<%//获取当前页面
  strpage = request.getParameter("page");
  if(strpage==null){
    curentpage = 1;
  }
  else{
   curentpage = Integer.parseInt(strpage);
   if(curentpage<1) curentpage=1;
  }
%>
<%//使用数据库做留言板
  try{
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  }
  catch(Exception e)
  {
  out.print(e);
  }
%>
<html >
<head>
<title>0602班级留言板</title>
 <script language ="javascript">
  function del()
  {
if(confirm("确定删除?")))
  {
location.href="index.jsp";
  }
  
  }
 </script>
</head>
<body>
<div class="container">
<%@ include file= "top.jsp" %>
  <div id="content">
 <% 
    try{//链接数据库并且读出数据
con = DriverManager.getConnection("jdbc:odbc:student","","");
        st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);        //获取总记录数
rs = st.executeQuery("select count(messageid) from message");
rs.next();
n = rs.getInt(1);String range = String.valueOf(pagesize*(curentpage-1));
String sql;
if(curentpage==1){
  sql="select top "+pagesize+" * from user,message where user.userid=message.userid order by messageid desc";
}
else
{
  sql="select top "+pagesize+" * from user,message where messageid not in(select top "+range+" messageid from user,message order by messageid desc) order by messageid desc";
}
 rs = st.executeQuery(sql);
pagecount = (n%pagesize)==0?(n/pagesize):(n/pagesize+1);//计算页数
if(pagecount>0){
String checkManager = (String)session.getAttribute("username");
        if(checkManager.equals("aidscooler"))
{//是管理员session设置为true
  session.setAttribute("isWebmaster","true");
}
else{//不是则session设置为false
                session.setAttribute("isWebmaster","false");
}
String isWebmaster = (String)session.getAttribute("isWebmaster");
//是管理员设置删除选项
if(isWebmaster.equals("true"))
    {
%>
 <table border="1">
<%
       
      while(rs.next())
      {
       %><tr>
      <%int id=rs.getInt("messageid");%>
          <td ><div class="message"><font style="font-size:18px">
            <%=rs.getInt("messageid")%>楼.作者:<%=rs.getString("username")%></font></div></td>
<td><div class="message"><font style="font-size:18px">
     <a href="delete.jsp?id=<%=id%>" onclick="del()">删除</a></font></div></td>
 </tr>
         <tr>
                  <td><div class="message"><font style="font-size:18px">
            标题:<%=rs.getString("title")%></font></div></td>
           </tr>
         <tr>
                   <td><div class="message"><font style="font-size:18px">
             内容:<%=rs.getString("comment")%></font></div></td>
         </tr>
       <%
                 }
}
else{//不是管理员,进行普通显示
                %>
          <table border="1">
     <%
     
      while(rs.next())
      {
       %><tr>
          <td width="960"><div class="message"><font style="font-size:18px">
            <%=rs.getInt("messageid")%>楼.作者:<%=rs.getString("username")%></font></div></td>
                 </tr>
         <tr>
                  <td><div class="message"><font style="font-size:18px">
            标题:<%=rs.getString("title")%></font></div></td>
           </tr>
         <tr>
                   <td><div class="message"><font style="font-size:18px">
             内容:<%=rs.getString("comment")%></font></div></td>
         </tr>
       <%
                 }
}
rs.close();
st.close();
    con.close();
 }
}
catch(Exception e)
{
out.print(e);
}
     
 %>
 </table>
  <form action="index.jsp" method = "post">
  第<%=curentpage%>页&nbsp;&nbsp;共<%=pagecount%>页
   <%if(curentpage>1){%>
      <a href="index.jsp?page=<%=curentpage-1%>">上一页</a>
   <%}%>  <%if(curentpage<pagecount){%>
      <a href="index.jsp?page=<%=curentpage+1%>">下一页</a>
   <%}%>
  </form>
  </div>
  <%@ include file = "bottom.jsp" %>
</div>
</body>
</html>
编译能通过,不过在页面会显示:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的游标状态
而且,分页后第一页能正常显示,第二页全是第一页中的第2条记录,不知道为什么,请高手帮忙看看,谢谢了

解决方案 »

  1.   

    页面中含有大量java代码,太乱了
      

  2.   

     sql="select top "+pagesize+" * from user,message where messageid not in(select top "+range+" messageid from user,message order by messageid desc) order by messageid desc"; sql = "select * from (select top "+pagesize+" * from (select top "+(start+pagesize)+" * from members) m1 order by m1.id desc) m2 order by m2.id asc";
    看出不同了吗?
      

  3.   

    编译能通过,不过在页面会显示:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的游标状态肯定是连接数据库的时候出了问题 
    如果能够连接上的话 就是sql语句出问题了 
    在把sql语句在数据库中运行一下 看可以吗
      

  4.   

    第一次查询结束后,rs最好关闭以下。
    rs = st.executeQuery("select count(messageid) from message"); 
    rs.next(); 
    n = rs.getInt(1); 
    加上以下代码:
    if(rs!=null){
        rs.close();
        rs=null;
    }
      

  5.   

    编译能通过,不过在页面会显示:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的游标状态 
    而且,分页后第一页能正常显示,第二页全是第一页中的第2条记录,不知道为什么
      

  6.   

    是access数据库,忘记说了,不好意思
      

  7.   

    我感觉第一个问题
    java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的游标状态 
    是rs,st的问题
    那么在第一个查询后st也关闭下呢?
    if(st!=null){
        st.close();
        st=null;
    }
    第二次查询开始前
    st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 问题二显示纪录的问题应该是SQL文写的有问题
    使用嵌套查询
    sql="select top "+pagesize+" * from user,message where messageid not in(select top "+range+" messageid from user,message order by messageid desc) order by messageid desc"; 

    sql="select top "+pagesize+" * from (select * from user,message where messageid not in(select top "+range+" messageid from user,message order by messageid desc)) order by messageid desc";
      

  8.   

    sql问题解决了,主要是没有加入查询条件user.userid=message.userid ,第一个问题还是在···郁闷
    sql="select top "+pagesize+" * from user,message where messageid not in(select top "+range+" messageid from user,message where user.userid=message.userid order by messageid desc) and user.userid=message.userid order by messageid desc";
      

  9.   

    st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 
    创建st时,不带参数呢?
    st = con.createStatement();
      

  10.   

    是 st的问题 ,进行下一次sql查询前,把rs,st都关闭一下.if(rs!=null){ 
        rs.close(); 
        rs=null; 
    } if(st!=null){ 
        st.close(); 
        st=null; 
    } 不行的话st创建的时候不带参数
    st = con.createStatement();