使用自定义参数
?
在上篇http://mqingqing123.cnblogs.com/archive/2006/04/07/369020.html
介紹了ObjectDataSource的常規(guī)使用。
上次一個(gè)網(wǎng)友希望介紹一下自定義分頁的問題,本文說明如何使用ObjectDataSource自定義分頁、排序,你會(huì)發(fā)現(xiàn)ObjectDataSource的伸縮性很大,。不管是初學(xué)者還是具有一定經(jīng)驗(yàn)的用戶,ObjectDataSource總能夠給你提供能夠滿足你要求的功能。
?
??? 在數(shù)據(jù)分頁中,最簡單是利用GridView的分頁、排序功能,此功能不幾乎應(yīng)該是確實(shí)不需要編寫代碼,稍微勾勾劃劃就能夠分頁、排序。然而當(dāng)數(shù)據(jù)量很少時(shí),以來此方法確實(shí)可以減輕程序員的負(fù)擔(dān),但是當(dāng)數(shù)據(jù)很多,例如記錄幾十萬、上百萬時(shí),使用系統(tǒng)自帶的分頁將導(dǎo)致大量數(shù)據(jù)回復(fù),因此使用自定義分頁就顯得更為有效。
概括起來,天天總結(jié)自定義數(shù)據(jù)分頁主要包含四種方式:
1)?使用臨時(shí)表――此方法被廣泛使用論壇CommunityServer、博客等開源代碼
2)?使用存儲(chǔ)過程――這個(gè)方法好像最初來自CSDN上的一篇,可以到如下網(wǎng)址查看博客圓里的一篇文章
http://genson.cnblogs.com/archive/2006/01/17/318882.html
3)?利用SQL語句選取有限數(shù)據(jù)分頁,此方法我用過,感覺有一些問題,還有待進(jìn)一步證實(shí)。
4)?可以利用GirdView的客戶端到服務(wù)器的回調(diào)獲得新頁的數(shù)據(jù),這是ASP.NET2.0新增的一個(gè)功能。
?
本文主要介紹第一種使用臨時(shí)表進(jìn)行分頁。以后會(huì)介紹其它方式
?
下面是對(duì)上面文章的更改。代碼如下,使用臨時(shí)表進(jìn)行自定義分頁:
?
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 =?@"
?
?????-- 為分頁建立一張臨時(shí)表
?
????CREATE TABLE #TempPageTable
?
????(
?
????????IndexId int IDENTITY (0, 1) NOT NULL,
?
?????????id int???
?
?????)
?
?
?
????-- 讀取數(shù)據(jù)插入臨時(shí)表
?
????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)這里定義了一個(gè)臨時(shí)表 #TempPageTable,臨時(shí)表的定義需要加“#”,臨時(shí)表的好處是自動(dòng)創(chuàng)建,并在不需要時(shí)候進(jìn)行銷毀。具體介紹請(qǐng)參考SQL的幫助系統(tǒng)。
2)在臨時(shí)表里我建立了一個(gè)索引印列IndexId和id列。如果你查看我的數(shù)據(jù)庫Producst表的設(shè)計(jì)可以看到該表包含一個(gè)ProductID列,該列是一個(gè)自增型標(biāo)識(shí)種子,那么為什么還需要建立IndexId列?
這是因?yàn)镻roduct表的ProductID列是一個(gè)自增形式,所以序號(hào)將會(huì)在你編輯時(shí)可能會(huì)打亂,例如原來產(chǎn)品記錄是1,2,3,4,5后來你刪除了一條記錄,例如5,那么當(dāng)你再增加一條記錄時(shí),新的序列號(hào)將是從6開始,而不會(huì)使用原來的5。
為了讓索引不斷號(hào)的自增,使用了自定義了自增的IndexId臨時(shí)表。
3)臨時(shí)表里的id列對(duì)應(yīng)ProductID,正如你看到的,該id列插入的數(shù)據(jù)實(shí)際上來自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"?/>
?
具體的解釋請(qǐng)自己研究吧。
單擊此處源代碼下載:/Files/mqingqing123/ObjectDataSourceExample.rar
使用VS.NET2005或者VWD2005以“File System”放置打開,可以直接運(yùn)行本文源代碼。
?
?
?
?
?
?
ObjectDataSource提供了六個(gè)參數(shù)列表占位符號(hào),除此以外,還可以自定義自己的參數(shù)列表,如下:
1
<SelectParameters>
?????? <asp:QueryStringParameter Name="CategoryName" QueryStringFiled="CategoryName" />
??????? <XXXX:MyCustomParam Name="Param2" SomeAttribute="SomeValue" />
??? </SelectParameters>
請(qǐng)注意上面粗體字體,它就是自定義的模式,如果要自定義參數(shù)列表,需要如下步驟
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);
}
下面是一個(gè)示例,來自國外一個(gè)人的博客
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位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
- 上一篇: ESFramework介绍之(21)--
- 下一篇: 申请了团队blog,不知道能否给开通