select  *  from table
where   id in(select 
top 20 id from table where xxx)
and id not in(select top 10 from table where xxx)

解决方案 »

  1.   

    用webdiyer的分页控件吧!两句代码即实现。
    http://webdiyer.europe.webmatrixhosting.net/
      

  2.   

    OleDbConnection conn;
    OleDbCommand cmd;
    void Page_Load(object src,EventArgs e){
    conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("db"));
    if(!Page.IsPostBack){
    cmd=new OleDbCommand("select count(*) from destacc where id>0",conn);
    conn.Open();
    pager1.RecordCount=(int)cmd.ExecuteScalar();
    conn.Close();
    BindData();
    }
    }void BindData(){
    cmd=new OleDbCommand("select * from destacc where id>0",conn);
    OleDbDataAdapter adapter=new OleDbDataAdapter(cmd);
    DataSet ds=new DataSet();
    adapter.Fill(ds,pager1.PageSize*(pager1.CurrentPageIndex-1),pager1.PageSize,"temptbl");
    datagrid1.DataSource=ds.Tables["temptbl"];
    datagrid1.DataBind();
    }void ChangePage(object src,PageChangedEventArgs e){
    pager1.CurrentPageIndex=e.NewPageIndex;
    BindData();
    }
      

  3.   

    请问如果用cursor该怎么作呢???
      

  4.   

    照 cpp2017(幕白兄) ( ) 写的做就可以了,我也是这么做的
      

  5.   

    wubin264的想法非常有创意,,,,,,,,
      

  6.   

    查询结果分页是以较小数据子集(即页)的形式返回查询结果的过程。它通常用于以易于管理的小块区的形式向用户显示结果。
    DataAdapter 提供了通过 Fill 方法的重载来仅返回一页数据的功能。但是,对于大量的查询结果,它可能并不是首选的分页方法,因为 DataAdapter 虽然仅使用所请求的记录来填充目标 DataTable 或 DataSet,但仍会使用返回整个查询的资源。若要在从数据源中返回一页数据时不使用返回整个查询所需的资源,请为查询指定附加条件,使返回的行数减少到只返回所需的行。
    若要使用 Fill 方法返回一页数据,请指定 startRecord(它指定该数据页的第一个记录),并指定 maxRecords(它指定该数据页中的记录数)。
    以下代码示例显示如何使用 Fill 方法来返回查询结果(页大小为 5 个记录)的第一页。
    [Visual Basic]
    Dim currentIndex As Integer = 0
    Dim pageSize As Integer = 5Dim orderSQL As String = "SELECT * FROM Orders ORDER BY OrderID"
    Dim myDA As SqlDataAdapter = New SqlDataAdapter(orderSQL, nwindConn)Dim myDS As DataSet = New DataSet()
    myDA.Fill(myDS, currentIndex, pageSize, "Orders")
    [C#]
    int currentIndex = 0;
    int pageSize = 5;string orderSQL = "SELECT * FROM Orders ORDER BY OrderID";
    SqlDataAdapter myDA = new SqlDataAdapter(orderSQL, nwindConn);DataSet myDS = new DataSet();
    myDA.Fill(myDS, currentIndex, pageSize, "Orders");
    在上例中,DataSet 只填充了 5 个记录,但却返回了整个 Orders 表。若要用相同的 5 个记录填充 DataSet 但仅返回这 5 个记录,请在 SQL 语句中使用 TOP 和 WHERE 语句,如以下代码示例所示。
    [Visual Basic]
    Dim pageSize As Integer = 5Dim orderSQL As String = "SELECT TOP " & pageSize & " * FROM Orders ORDER BY OrderID"
    Dim myDA As SqlDataAdapter = New SqlDataAdapter(orderSQL, nwindConn)Dim myDS As DataSet = New DataSet()
    myDA.Fill(myDS, "Orders")
    [C#]
    int pageSize = 5;string orderSQL = "SELECT TOP " + pageSize + " * FROM Orders ORDER BY OrderID";
    SqlDataAdapter myDA = new SqlDataAdapter(orderSQL, nwindConn);DataSet myDS = new DataSet();
    myDA.Fill(myDS, "Orders");
    请注意,当以这种方式进行查询结果分页时,将需要保留用作行排序依据的唯一标识符,以便将唯一的 ID 传递给用于返回下一页记录的命令,如以下代码示例所示。
    [Visual Basic]
    Dim lastRecord As String = myDS.Tables("Orders").Rows(pageSize - 1)("OrderID").ToString()
    [C#]
    string lastRecord = myDS.Tables["Orders"].Rows[pageSize - 1]["OrderID"].ToString();
    若要使用附带 startRecord 和 maxRecords 参数的 Fill 方法的重载来返回下一页记录,请使当前记录索引按页大小递增,并填充该表。请记住,即使仅在 DataSet 中添加一页记录,数据库服务器仍会返回全部查询结果。在以下代码示例中,先清除表行,然后再用下一页数据填充这些表行。您可能需要在本地缓存中保留一定数量的返回行,以减少到数据库服务器的往返过程。
    [Visual Basic]
    currentIndex = currentIndex + pageSizemyDS.Tables("Orders").Rows.Clear()myDA.Fill(myDS, currentIndex, pageSize, "Orders")
    [C#]
    currentIndex += pageSize;myDS.Tables["Orders"].Rows.Clear();myDA.Fill(myDS, currentIndex, pageSize, "Orders");
    若要返回下一页记录而不让数据库服务器返回整个查询,请指定对 SQL SELECT 语句的限制条件。由于上例保留了返回的最后一个记录,因此可以在 WHERE 子句中使用它来指定查询的起点,如以下代码示例所示。
    [Visual Basic]
    orderSQL = "SELECT TOP " & pageSize & " * FROM Orders WHERE OrderID > " & lastRecord & " ORDER BY OrderID"
    myDA.SelectCommand.CommandText = orderSQLmyDS.Tables("Orders").Rows.Clear()myDA.Fill(myDS, "Orders")
    [C#]
    orderSQL = "SELECT TOP " + pageSize + " * FROM Orders WHERE OrderID > " + lastRecord + " ORDER BY OrderID";
    myDA.SelectCommand.CommandText = orderSQL;myDS.Tables["Orders"].Rows.Clear();myDA.Fill(myDS, "Orders");