我现在是从数据库循环拿到多张表 的数据 放到一个 dataset中  然后一次性 加载到页面datagridview控件中去 ,由于数据量太大  有上80多W条记录 加载时间可能会有 好几分钟 。要做个分页的 但是 不知道怎么样对dataset的多表 的这种情况进行分页  望有 高手 帮帮我 或是有例子 我参考下,谢谢。 

解决方案 »

  1.   

    主要利用DataSet的筛选数据的方法
    DataAdapter用Fill方法填充DataSet的时候把所取的整个记录加入到DataSet
    例如:
        MyAdapter.Fill(DataSet,TableName);
    有时候并不需要将整个查询数据都导入DataSet,真正需要的只是数据的一部。Fill的另一种方法可以满足这种需要。
        MyAdapter.Fill(DataSet,StartRow,RowsCount,TableName);
    可以看到在这种使用方法中有多出了两个整型参数StartRow与RowCout,他们标识将数据源中从StartRow位置取出RowsCount条记录导入DataSet。得到数据后,程序还将DataSet中的数据显示出来。
      

  2.   

     代码如下:前台:fenye.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="fenye.aspx.cs" Inherits="fenye" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>DataList分页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:DataList ID="book" runat="server">
            <ItemTemplate>
                编号:<%#DataBinder.Eval(Container.DataItem,"book") %>
            </ItemTemplate>
            </asp:DataList></div>
            共有<asp:Label ID="lblRecordCount" runat="server"></asp:Label>条记录<br />
            当前为<asp:Label ID="lblCurrentPage" runat="server"/>/<asp:Label ID="lblPageCount" runat="server" Text="Label"/>页&nbsp;
            <br />
            <asp:LinkButton ID="lbnPrevPage" runat="server" CommandName="prev" OnCommand="Page_OnClick">上一页</asp:LinkButton>
            <asp:LinkButton ID="lbnNextPage" runat="server" CommandName="next" OnCommand="Page_OnClick">下一页</asp:LinkButton>
        </form>
    </body>
    </html>
     后台:fenye.aspx.cs using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    public partial class fenye : System.Web.UI.Page
    {
        SqlConnection sqlcon;
        int PageSize, RecordCount, PageCount, CurrentPage;
        public void Page_Load(object sender, EventArgs e)
        {
            PageSize = 3;
            sqlcon = new SqlConnection();
            sqlcon.ConnectionString = "Data Source=localhost;Initial Catalog=test;User Id=sa;Password=guest";
            sqlcon.Open();
            //第一次请求执行
            if (!Page.IsPostBack)
            {
                ListBind();
                CurrentPage = 0;
                ViewState["PageIndex"] = 0;            //计算总共有多少条记录
                RecordCount = CalculateRecord();
                lblRecordCount.Text = RecordCount.ToString();            //计算总共多少页
                PageCount = RecordCount / PageSize;
                lblPageCount.Text = PageCount.ToString();
                ViewState["PageCount"] = PageCount;         }
        }
            //计算总共有多少条记录
        public int CalculateRecord()
        {
            int intCount;
            string strCount = "select count(*) as co from book";
            SqlCommand sqlcmd = new SqlCommand(strCount,sqlcon);
            SqlDataReader sdr = sqlcmd.ExecuteReader();
            if (sdr.Read())
            {
                intCount = Int32.Parse(sdr["co"].ToString());
            }
            else
            {
                intCount = 0;
            }
            sdr.Close();
            return intCount;
        }
        ICollection CreateSource()  //ICollection为何使用?
        {
            int StartIndex;        //设定导入的起终地址
            StartIndex = CurrentPage * PageSize;
            string strSel = "select * from book";
            DataSet ds = new DataSet();
            SqlDataAdapter sda = new SqlDataAdapter(strSel, sqlcon);
            sda.Fill(ds,StartIndex,PageSize,"book");//分页的关键所在,该句表示将数据源中从StartIndex位置取出PageSize条记录导入DataSet.
            return ds.Tables["book"].DefaultView;
        }
        public void ListBind()
        {
            book.DataSource = CreateSource();
            book.DataBind();
            lbnNextPage.Enabled = true;
            lbnPrevPage.Enabled = true;
            if (CurrentPage == (PageCount - 1)) lbnNextPage.Enabled = false;
            if (CurrentPage == 0) lbnPrevPage.Enabled = false;
            lblCurrentPage.Text = (CurrentPage + 1).ToString();
        }
        public void Page_OnClick(Object sender, CommandEventArgs e)
        { 
            CurrentPage=(int)ViewState["PageIndex"];
            PageCount=(int)ViewState["PageCount"];
            string cmd = e.CommandName;
            //判断cmd,以判定翻页方向
            switch (cmd)
            { 
                case "next":
                    if(CurrentPage<(PageCount-1))  CurrentPage++;
                    break;
                case "prev":
                    if (CurrentPage > 0) CurrentPage--;
                    break;
            }
            ViewState["PageIndex"]=CurrentPage;
            ListBind();
        }       
    }
    分页的方式又很多,可以用PagedDataSource类,还可以只用数据库进行分页。
      

  3.   

    我的是winfrom 不是ASP 也有这些属性?
      

  4.   


    那就试第一种。MyAdapter.Fill(DataSet,StartRow,RowsCount,TableName); 
      

  5.   

    80多W条记录加载到DataSet已经很慢了
    如果必须使用DataSet分页的话,可以自己实现分页 从DataSet读取指定页转换新的DataSet再绑定
    分页自己算很简单,用index就可以。
      

  6.   

    后台代码:
    <asp:GridView runat="server" GridLines="Both" AutoGenerateColumns="False" EditRowStyle-Wrap="false"
                        ID="grid1" DataKeyNames="StudentID" RowStyle-Wrap="false" AllowPaging="True"
                        PageSize="8" PagerSettings-Mode="NextPreviousFirstLast" PagerSettings-FirstPageText="首页"
                        PagerSettings-LastPageText="末页" PagerSettings-NextPageText="下一页" PagerSettings-PreviousPageText="上一页"
                        PagerSettings-PageButtonCount="5" PagerStyle-HorizontalAlign="Left" BackColor="White"
                        BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="3" Width="500px"
                        OnPageIndexChanging="OnPageChange">
    前台代码:
     private void GetMyTeacher()
        {
            
            DataSet ds  = DbHelper.GetMyTeacher(CurrentUser.LoginName);
            if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
            {
                grid1.DataSource = ds.Tables[0].DefaultView;
                grid1.DataBind();
            }
            else
            {
                lbResult.Text = "没有....";
                return;
            }
        }
        protected void OnPageChange(object sender, GridViewPageEventArgs e)
        {
            grid1.PageIndex = e.NewPageIndex;
            this.GetMyTeacher();
        }
      

  7.   

    用这东西!!!
     public System.Data.DataSet GetPageDataSetBySQL(ref int DataCount,StringBuilder sql,int currentPage, int pagesize)
            {
                try
                {                this.Open();
                    SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(sql.ToString(), this.connection);
                    DataSet ds = new DataSet();
                    int startRow = (currentPage - 1) * pagesize;
                    mySqlDataAdapter.Fill(ds,startRow,pagesize,"table");
                    DataCount = GetRowCountRecord(sql.ToString());
                    return ds;
                }
                catch (Exception e)
                {
                    throw new SQLException(e.Message);
                }
                finally
                {
                    this.Close();
                }        }
    currentPage: 当前页索引,
    pagesize:   每页的记录数!给分页个事件,每次点击都出发,重新去去数据!  利用上面函数取值,然后重新绑定(记的改下 GRID的 分页索引)
      

  8.   

    忙了两天  还是没法解决 换成 成服务端 将所有数据 传到一个新的Table中 再传入客户端 那样就只要对一个 datatable进行分页了....  还是谢谢各位了
      

  9.   

    我也是在头疼这个winfrom的分页,自己写了那么长时间还是没有弄出来,呵呵