指定到指定记录可以在sql语句里面做到地?为什么要通过结果集做这个工作?

解决方案 »

  1.   

    我做了一个表单查询页面,其中有“上一条”“下一条”“头条”“尾条”等。
    我先把所有数据读入结果集,然后想通过对结果集的操作来完成对数据库的操作。
    可是现在我的问题很奇怪。头条,尾条,都正常。
    就是上一条,每次按都显示上标越界(是我自己加的差错语句),而每次点击下一条,都只显示第一条,好像指针一只停留在结果集的首条记录上,没有移动过。
    可是为什么头条尾条可以正常工作?
    现在把源码贴出来,如下:<html><head>
    <meta http-equiv="Content-Language" content="zh-cn">
    <meta name="GENERATOR" content="Microsoft FrontPage 5.0">
    <meta name="ProgId" content="FrontPage.Editor.Document">
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>Input Data</title>
    </head><body bgcolor="#fdf5e6">
    <%
    response.setHeader("progma","no-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires",0);
    %>  <%@page language="java" import="java.sql.*"%>
      <jsp:useBean id="codein" scope="page" class="database.dbbean"/>
      <%codein.init("jdbc:odbc:f_code","dbuser","dbpassword");%>
      <%! String val1="  ";%>
      <%! String val2="  ";%>  <% ResultSet rs=codein.executeQuery("SELECT * FROM F_CODE");%>  <% String strName = new String(request.getParameter("submit").getBytes("ISO-8859-1"));%>  <% if(strName.equals("previous")){
    rs.moveToCurrentRow();
    if(rs.previous()){
      val1=rs.getString("name");
      val2=rs.getString("content");}
    else{
      out.println("Overflow!");
    }
     }
     else if(strName.equals("next")){
     rs.moveToCurrentRow();
     if(rs.next()){
     val1=rs.getString("name");
     val2=rs.getString("content");}
     else{
     out.println("Underflow!");
     }
     }
     else if(strName.equals("top")){
     rs.first();
     val1=rs.getString("name");
     val2=rs.getString("content");}
     else if(strName.equals("bottom")){
     rs.last();
     val1=rs.getString("name");
     val2=rs.getString("content");}
     else if(strName.equals("add")){
     rs.moveToInsertRow();
     val1="";
     val2="";}
     else if(strName.equals("delete")){
     rs.moveToCurrentRow();
     rs.deleteRow();
     val1=rs.getString("name");
     val2=rs.getString("content");}
     else{
     String nm=request.getParameter("name");
     String ct=request.getParameter("content");
     rs.updateString("name",nm);
     rs.updateString("content",ct);
     rs.insertRow();}
      %><p align="center">Input data</p>
    <form method="POST" action="inputCode.jsp"> <!--怎么样才能使他有能力自动刷新?-->
      <table border="0" style="border-collapse: collapse" bordercolor="#111111" width="100%">
        <tr>
          <td width="50%" align="right">field name&nbsp;&nbsp;&nbsp; </td>
          <td width="50%"><input type="text" name="name" size="20" value=<%=val1%>></td>
        </tr>
        <tr>
          <td width="50%" align="right">field content&nbsp;&nbsp;&nbsp; </td>
          <td width="50%"><input type="text" name="content" size="20" value=<%=val2%>></td>
        </tr>
      </table>
      
    <p></p>
    <br>  <table border="0" style="border-collapse: collapse" bordercolor="#111111" width="100%">
        <tr>
          <td width="14%" align="center">
          <input type="submit" value="previous" name="submit"></td>
          <td width="14%" align="center">
          <input type="submit" value="next" name="submit"></td>
          <td width="14%" align="center">
          <input type="submit" value="top" name="submit"></td>
          <td width="14%" align="center">
          <input type="submit" value="bottom" name="submit"></td>
          <td width="14%" align="center">
          <input type="submit" value="add" name="submit"></td>
          <td width="15%" align="center">
          <input type="submit" value="delete" name="submit"></td>
          <td width="15%" align="center">
          <input type="submit" value="save" name="submit"></td>
        </tr>
      </table></form>
    </body>
    </html>还有就是删除不能正常工作,每次都提示游标状态不合法。
    谁能帮我解决,我开新贴送200分!
      

  2.   

    送分帖已经开好:
    http://expert.csdn.net/Expert/topic/2087/2087863.xml?temp=.5034906
    http://expert.csdn.net/Expert/topic/2087/2087876.xml?temp=.4152338
    希望高手踊跃解答。
      

  3.   

    与bean中Statement 有关系,最好改成JDBC
    Statement statement = myconn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
      

  4.   

    如果改成了TYPE_SCOLL_INSENSITIVE,结果集不是就变成单向滚动的了吗?
    如何来实现“上一条”?
    CONCUR_READ_ONLY什么意思?
      

  5.   

    创建Statement时加上参数TYPE_SCROLL_SENSITIVE,
    Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY );
    要往前移动游标要设定createStatement的参数,具体是不是这个你自己查一下还有不明白的是,你每次都去取数据的话,怎么来取前一条和后一条啊?
      

  6.   

    amortal(7086)大哥真是一针见血阿。问题我找到了,每次都执行resultset当然不行了。哈哈,心情好了很多。不过,后来我改了一下。
    <%! ResultSet rs=codein.executeQuery("SELECT * FROM F_CODE");%>
    把这句变成申明,我想申明总是只执行一次的,可是为什么又出现这个错误?
    Generated servlet error:
        [javac] Since fork is true, ignoring compiler setting.
        [javac] Compiling 1 source file
        [javac] Since fork is true, ignoring compiler setting.
        [javac] C:\jakarta-tomcat-4.1.24\work\Standalone\localhost\_\inputCode_jsp.java:13: cannot resolve symbol
        [javac] symbol  : variable codein  
        [javac] location: class org.apache.jsp.inputCode_jsp
        [javac]  ResultSet rs=codein.executeQuery("SELECT * FROM F_CODE");
        [javac]               ^
        [javac] 1 error
    申明里面不可以直接放吗?
    有什么办法是某句话只调用一次?
      

  7.   

    rs中有一个absolute的方法
    它是来定义你的游标具体在什么地方的方法!
    你现在每次都刷新,当然你必须正确的得到游标的位置,否则每次刷新游标的位置都不正确!int PageSize = 3; //设置每张网页显示两笔记录
    int ShowPage = 1; //设置欲显示的页数
    int RowCount = 0; //ResultSet的记录笔数
    int PageCount = 0; //ResultSet分页后的总页数<%
            try{
    db.openQueryDB();
                    rs = db.executeQuery(strSQL);//               rs.last(); //将指标移至最后一笔记录
    // RowCount = rs.getRow(); //取得ResultSet中记录的笔数
    // //计算显示的页数
    // PageCount = ((RowCount % PageSize) == 0 ?
    // (RowCount/PageSize) : (RowCount/PageSize)+1);
    }
    catch(Exception ex)
    {
    System.out.println(ex.toString());%><%
    String ToPage = request.getParameter("ToPage");
    if(ToPage != null) //判断是否可正确取得ToPage参数
    {
    ShowPage = Integer.parseInt(ToPage);  //取得指定显示的分页页数
    if(ShowPage > PageCount)  //下面的if语句将判断用户输入的页数是否正确
    {
    ShowPage = PageCount;  //判断指定页数是否大于总页数, 是则设置显示最后一页
    }
    else if(ShowPage <= 0)
    {
    ShowPage = 1;  //若指定页数小于0, 则设置显示第一页的记录
    }
    }
    rs.absolute((ShowPage - 1) * PageSize + 1);  //计算欲显示页的第一笔记录位置然后相应的previous,next,delete这些操作都要对游标的位置进行处理!
      

  8.   

    我觉得每次从数据库力度出来当前页,用sql语句直接得到是本页信息,
    sql语句实现分页的话,速度也很快,效果也很好