使用自定义参数
?
在上篇http://mqingqing123.cnblogs.com/archive/2006/04/07/369020.html
介紹了ObjectDataSource的常規使用。
上次一個網友希望介紹一下自定義分頁的問題,本文說明如何使用ObjectDataSource自定義分頁、排序,你會發現ObjectDataSource的伸縮性很大,。不管是初學者還是具有一定經驗的用戶,ObjectDataSource總能夠給你提供能夠滿足你要求的功能。
?
??? 在數據分頁中,最簡單是利用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>
?
???????? <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"?/>
?
具體的解釋請自己研究吧。
單擊此處源代碼下載:/Files/mqingqing123/ObjectDataSourceExample.rar
使用VS.NET2005或者VWD2005以“File System”放置打開,可以直接運行本文源代碼。
?
?
?
?
?
?
ObjectDataSource提供了六個參數列表占位符號,除此以外,還可以自定義自己的參數列表,如下:
1
<SelectParameters>
?????? <asp:QueryStringParameter Name="CategoryName" QueryStringFiled="CategoryName" />
??????? <XXXX:MyCustomParam Name="Param2" SomeAttribute="SomeValue" />
??? </SelectParameters>
請注意上面粗體字體,它就是自定義的模式,如果要自定義參數列表,需要如下步驟
1)從Parameter派生
public class MyParameter : System.Web.UI.WebControls.Parameter
2)重載Evaluate和Clone方法
protected override object Evaluate(HttpContext context, Control control)
{
?? return "My value";
}
?
?
protected override Parameter Clone()
{
??? return new MyParameter(this);
}
下面是一個示例,來自國外一個人的博客
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
?
namespace ClassLibrary1
{
??? public class MyParameter : Parameter
??? {
??????? public MyParameter(string name, object value) : base(name)
??????? {
???? ???????this.MyProperty = value;
??????? }
?
?
??????? public MyParameter(string name, TypeCode type, object value) : base(name, type)
??????? {
??????????? this.MyProperty = value;
??????? }
?
?
??????? protected MyParameter(MyParameter original) : base(original)
??????? {
??????????? this.MyProperty = original.MyProperty;
??????? }
?
?
??????? protected override object Evaluate(HttpContext context, Control control)
??????? {
??????????? return "My value";
??????? }
?
?
??????? protected override Parameter Clone()
??????? {
??????????? return new MyParameter(this);
??????? }
?
?
??????? public string MyProperty
??????? {
??????????? get
??????????? {
??????????????? object obj = base.ViewState["MyProperty"];
?
??????????????? if (obj == null)
?????????????????? ?return string.Empty;
?
??????????????? return (string)obj;
??????????? }
??????????? set
??????????? {
??????????????? if (this.MyProperty != value)
??????????????? {
??????????????????? base.ViewState["MyProperty"] = value;
??????????????????? base.OnParameterChanged();
??????????????? }
??????????? }
??????? }
???? }
}
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: ESFramework介绍之(21)--
- 下一篇: 申请了团队blog,不知道能否给开通