惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
博客园 - Franky
J
Java Code Geeks
V
Visual Studio Blog
G
Google Developers Blog
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
博客园 - 司徒正美
The GitHub Blog
The GitHub Blog
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
博客园 - 【当耐特】
IT之家
IT之家
I
InfoQ
U
Unit 42
C
Check Point Blog
Martin Fowler
Martin Fowler

博客园 - suny2006

关于xml的模糊查询问题 - suny2006 - 博客园 XmlDocument 操作xml文档 - suny2006 - 博客园 使用正则表达式 Eclipse3.2 中 Java Web(Jsp) 开发环境的搭建之 Lomboz+Tomcat 如何在asp.net中关闭B页面时,自动刷新A页面? - suny2006 - 博客园 Asp.Net防止刷新重复提交数据小记 Asp.Net防止刷新重复提交数据小记 如何使用变量给数据源控件参数赋值、如何动态增减数据源控件参数并支持分页 sql注入 下载www.youtube.com网站上视频的方法…… 使用 ADO.NET 访问 Oracle 9i 存储过程 ASP.NET调用oracle存储过程实现快速分页 关于一个网站实现简体和繁体的解决方案 vs2005比2003有什么本质性的变化?(转载) ASP.NET页面信息传递方法 试验通过就是牛 ---- 据说是世界编程大赛第一名写的程序 CODES 常用。NET相关网站 从ASP.NET数据库某字段为空时的处理所衍生出来的思考
一步一步学习ObjectDataSource控件--自定义分页排序
suny2006 · 2006-09-26 · via 博客园 - suny2006

    在数据分页中,最简单是利用GridView的分页、排序功能,此功能不几乎应该是确实不需要编写代码,稍微勾勾划划就能够分页、排序。然而当数据量很少时,以来此方法确实可以减轻程序员的负担,但是当数据很多,例如记录几十万、上百万时,使用系统自带的分页将导致大量数据回复,因此使用自定义分页就显得更为有效。

概括起来,天天总结自定义数据分页主要包含四种方式:
1) 使用临时表――此方法被广泛使用论坛CommunityServer、博客等开源代码
2) 使用存储过程――这个方法好像最初来自CSDN上的一篇,可以到如下网址查看博客圆里的一篇文章
http://genson.cnblogs.com/archive/2006/01/17/318882.html
3) 利用SQL语句选取有限数据分页,此方法我用过,感觉有一些问题,还有待进一步证实。
4) 可以利用GirdView的客户端到服务器的回调获得新页的数据,这是ASP.NET2.0新增的一个功能。

本文主要介绍第一种使用临时表进行分页。以后会介绍其它方式

下面是对上面文章的更改。代码如下,使用临时表进行自定义分页:

public List<Product> LoadAllProduct(int startIndex, int maxRows, string sortedBy)

    {

        List<Product> products = new List<Product>();

            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

    string commandText = @"

     -- 为分页建立一张临时表

    CREATE TABLE #TempPageTable

    (

        IndexId int IDENTITY (0, 1) NOT NULL,

         id int   

     )

    -- 读取数据插入临时表

    INSERT INTO #TempPageTable

     (

         [id]

     )

     SELECT

         [Productid]   

     FROM Products";

         if (sortedBy != "")

        {

              commandText += " ORDER BY " + sortedBy;

         }

         commandText += @"

    SET @totalRecords = @@ROWCOUNT

    SELECT

         src.[ProductID],

         src.[ProductName],

         src.[CategoryID],

         src.[Price],

        src.[InStore],

        src.[Description]  

     FROM Products src, #TempPageTable p

     WHERE 

         src.[productid] = p.[id] AND

        p.IndexId >= @StartIndex AND p.IndexId < (@startIndex + @maxRows)";

        if (sortedBy != "") {

              commandText += " ORDER BY " + sortedBy;

         }

         SqlCommand command = new SqlCommand(commandText, conn);

         command.Parameters.Add(new SqlParameter("@startIndex", startIndex));

         command.Parameters.Add(new SqlParameter("@maxRows", maxRows));

         command.Parameters.Add(new SqlParameter("@totalRecords", SqlDbType.Int));

         command.Parameters["@totalRecords"].Direction = ParameterDirection.Output;

         conn.Open();

         SqlDataReader dr = command.ExecuteReader();

         while (dr.Read()) {

              Product prod = new Product();

              prod.ProductID = (int)dr["ProductID"];

              prod.ProductName= (string)dr["ProductName"];

            prod.CategoryID = (int)dr["CategoryID"];

              prod.Price = (decimal)dr["price"];

            prod.InStore=(Int16)dr["InStore"];

            prod.Description=(String)dr["Description"];

              products.Add(prod);

         }

         dr.Close();

         conn.Close();

         _count = (int)command.Parameters["@totalRecords"].Value;

         return products;

     }

    public int CountAll()

    {

        return _count;

    }


简单解释如下:
1)这里定义了一个临时表 #TempPageTable,临时表的定义需要加“#”,临时表的好处是自动创建,并在不需要时候进行销毁。具体介绍请参考SQL的帮助系统。
2)在临时表里我建立了一个索引印列IndexId和id列。如果你查看我的数据库Producst表的设计可以看到该表包含一个ProductID列,该列是一个自增型标识种子,那么为什么还需要建立IndexId列?
这是因为Product表的ProductID列是一个自增形式,所以序号将会在你编辑时可能会打乱,例如原来产品记录是1,2,3,4,5后来你删除了一条记录,例如5,那么当你再增加一条记录时,新的序列号将是从6开始,而不会使用原来的5。
为了让索引不断号的自增,使用了自定义了自增的IndexId临时表。
3)临时表里的id列对应ProductID,正如你看到的,该id列插入的数据实际上来自Products表的ProductID列

   
下面是在页面使用的源代码:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="LoadAllProduct" TypeName="ProductBLL" DataObjectTypeName="Product"

        EnablePaging="True" MaximumRowsParameterName="maxRows" StartRowIndexParameterName="startIndex" SelectCountMethod="CountAll" SortParameterName="sortedBy"

        ></asp:ObjectDataSource>

        &nbsp;&nbsp;<asp:GridView ID="GridView1" runat="server" CellPadding="4" Font-Names="Verdana"

            Font-Size="X-Small" ForeColor="#333333" GridLines="None" DataSourceID="ObjectDataSource1" AllowPaging="True" AllowSorting="True">

            <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />

posted on 2006-04-10 11:06 天天 阅读(1145) 评论(6)  编辑 收藏 引用 收藏至365Key 所属分类: ASP.NET V2.0


FeedBack:

# re: 一步一步学习ObjectDataSource控件--自定义分页排序

2006-04-12 16:23 | WOW玩家

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="LoadAllProduct" TypeName="ProductBLL" DataObjectTypeName="Product"

EnablePaging="True" MaximumRowsParameterName="maxRows" StartRowIndexParameterName="startIn

    在数据分页中,最简单是利用GridView的分页、排序功能,此功能不几乎应该是确实不需要编写代码,稍微勾勾划划就能够分页、排序。然而当数据量很少时,以来此方法确实可以减轻程序员的负担,但是当数据很多,例如记录几十万、上百万时,使用系统自带的分页将导致大量数据回复,因此使用自定义分页就显得更为有效。

概括起来,天天总结自定义数据分页主要包含四种方式:
1) 使用临时表――此方法被广泛使用论坛CommunityServer、博客等开源代码
2) 使用存储过程――这个方法好像最初来自CSDN上的一篇,可以到如下网址查看博客圆里的一篇文章

http://genson.cnblogs.com/archive/2006/01/17/318882.html
3) 利用SQL语句选取有限数据分页,此方法我用过,感觉有一些问题,还有待进一步证实。
4) 可以利用GirdView的客户端到服务器的回调获得新页的数据,这是ASP.NET2.0新增的一个功能。

本文主要介绍第一种使用临时表进行分页。以后会介绍其它方式

下面是对上面文章的更改。代码如下,使用临时表进行自定义分页:

public List<Product> LoadAllProduct(int startIndex, int maxRows, string sortedBy)

    {

        List<Product> products = new List<Product>();

            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

    string commandText = @"

     -- 为分页建立一张临时表

    CREATE TABLE #TempPageTable

    (

        IndexId int IDENTITY (0, 1) NOT NULL,

         id int   

     )

    -- 读取数据插入临时表

    INSERT INTO #TempPageTable

     (

         [id]

     )

     SELECT

         [Productid]   

     FROM Products";

         if (sortedBy != "")

        {

              commandText += " ORDER BY " + sortedBy;

         }

         commandText += @"

    SET @totalRecords = @@ROWCOUNT

    SELECT

         src.[ProductID],

         src.[ProductName],

         src.[CategoryID],

         src.[Price],

        src.[InStore],

        src.[Description]  

     FROM Products src, #TempPageTable p

     WHERE 

         src.[productid] = p.[id] AND

        p.IndexId >= @StartIndex AND p.IndexId < (@startIndex + @maxRows)";

        if (sortedBy != "") {

              commandText += " ORDER BY " + sortedBy;

         }

         SqlCommand command = new SqlCommand(commandText, conn);

         command.Parameters.Add(new SqlParameter("@startIndex", startIndex));

         command.Parameters.Add(new SqlParameter("@maxRows", maxRows));

         command.Parameters.Add(new SqlParameter("@totalRecords", SqlDbType.Int));

         command.Parameters["@totalRecords"].Direction = ParameterDirection.Output;

         conn.Open();

         SqlDataReader dr = command.ExecuteReader();

         while (dr.Read()) {

              Product prod = new Product();

              prod.ProductID = (int)dr["ProductID"];

              prod.ProductName= (string)dr["ProductName"];

            prod.CategoryID = (int)dr["CategoryID"];

              prod.Price = (decimal)dr["price"];

            prod.InStore=(Int16)dr["InStore"];

            prod.Description=(String)dr["Description"];

              products.Add(prod);

         }

         dr.Close();

         conn.Close();

         _count = (int)command.Parameters["@totalRecords"].Value;

         return products;

     }

    public int CountAll()

    {

        return _count;

    }


简单解释如下:
1)这里定义了一个临时表 #TempPageTable,临时表的定义需要加“#”,临时表的好处是自动创建,并在不需要时候进行销毁。具体介绍请参考SQL的帮助系统。
2)在临时表里我建立了一个索引印列IndexId和id列。如果你查看我的数据库Producst表的设计可以看到该表包含一个ProductID列,该列是一个自增型标识种子,那么为什么还需要建立IndexId列?
这是因为Product表的ProductID列是一个自增形式,所以序号将会在你编辑时可能会打乱,例如原来产品记录是1,2,3,4,5后来你删除了一条记录,例如5,那么当你再增加一条记录时,新的序列号将是从6开始,而不会使用原来的5。
为了让索引不断号的自增,使用了自定义了自增的IndexId临时表。
3)临时表里的id列对应ProductID,正如你看到的,该id列插入的数据实际上来自Products表的ProductID列

   
下面是在页面使用的源代码:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="LoadAllProduct" TypeName="ProductBLL" DataObjectTypeName="Product"

        EnablePaging="True" MaximumRowsParameterName="maxRows" StartRowIndexParameterName="startIndex" SelectCountMethod="CountAll" SortParameterName="sortedBy"

        ></asp:ObjectDataSource>

        &nbsp;&nbsp;<asp:GridView ID="GridView1" runat="server" CellPadding="4" Font-Names="Verdana"

            Font-Size="X-Small" ForeColor="#333333" GridLines="None" DataSourceID="ObjectDataSource1" AllowPaging="True" AllowSorting="True">

            <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />

posted on 2006-04-10 11:06 天天 阅读(1145) 评论(6)  编辑 收藏 引用 收藏至365Key 所属分类: ASP.NET V2.0


FeedBack:

# re: 一步一步学习ObjectDataSource控件--自定义分页排序

2006-04-12 16:23 | WOW玩家

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="LoadAllProduct" TypeName="ProductBLL" DataObjectTypeName="Product"

EnablePaging="True" MaximumRowsParameterName="maxRows" StartRowIndexParameterName="startIndex" SelectCountMethod="CountAll" SortParameterName="sortedBy"

></asp:ObjectDataSource>
dex" SelectCountMethod="CountAll" SortParameterName="sortedBy"

></asp:ObjectDataSource>