日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库

發(fā)布時間:2023/12/15 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

????這里要說的不僅僅是一個分頁控件,而是一套解決方案,包括如何顯示數(shù)據(jù)、顯示分頁導航,如何得到分頁用的sql語句(等效于存儲過程),如何提取數(shù)據(jù),如何綁定控件,如何響應事件,添加、修改、刪除數(shù)據(jù)后如何更新,如何查詢數(shù)據(jù)等等。一整套完整的解決方案。

?

????這個方案要有幾個特點

??????1、支持多種數(shù)據(jù)庫,可以提供多個分頁算法以便于支持多種數(shù)據(jù)庫。

??????2、可以在不同的要求下選用最優(yōu)的分頁算法。比如如果只需要按照主鍵排序,那么選擇Max分頁算法無疑是最快的一種分頁算法。

??????3、按需所取。不管是哪一種分頁算法,都要達到按需所取。假設一頁顯示20條記錄,那么從數(shù)據(jù)庫里面最多只提取20條記錄,不可以多取一條。

??????4、使用簡單。無論是更換分頁算法,更換數(shù)據(jù)庫,還是處理分頁的事件,都是很簡單的幾行代碼即可搞定。

??????5、很方便的實現(xiàn)數(shù)據(jù)查詢的功能。查詢后顯示數(shù)據(jù),查詢后修改、刪除數(shù)據(jù),修改、刪除后重新顯示數(shù)據(jù)等。

??????6、每一個部分都可以替換。

??????7、支持海量數(shù)據(jù)。無論數(shù)據(jù)多還是少,都要適合,而且要盡量快。

?

????分頁解決方案的組成部分

??????顯示數(shù)據(jù)的控件、分頁控件、分頁算法、數(shù)據(jù)訪問函數(shù)庫、數(shù)據(jù)庫?

??????如:GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + SQL Server2000

??????1、顯示數(shù)據(jù)的控件可以是GridViewDetailsViewFormViewRepeaterDataGridDataListCheckBoxListRadioButtonList等。(控件的繼承關系可以看這里http://www.cnblogs.com/jyk/archive/2009/04/29/1446033.html?這是.net 里面帶的幾個常用控件的繼承樹)。也可以支持直接返回DataTable等記錄集。

??????2、分頁控件,可以是QuickPager也可以是吳旗娃的分頁控件,也可以是EasyTools等其他的分頁控件。

??????3、分頁算法目前還沒有發(fā)現(xiàn)同類的,硬要算的話,儲存過程有一點點類似。

??????QuickPager_SQL? 原來是QuickPager里面的一部分,現(xiàn)在獨立出來,可以單獨使用了。

??????4、數(shù)據(jù)訪問函數(shù)庫可以換成SQLHelp、微軟的企業(yè)庫等,當然需要其他的實現(xiàn)一個接口(IDALforPager)。

??????5、數(shù)據(jù)庫可以是AccessExcelSQL Server,理論上也支持OrcaleMySQL等,只是沒有安裝這些數(shù)據(jù)庫,所以還沒有具體實現(xiàn)。

?

??????(至于ORM嘛,不是太了解,不知道能不能和哪個部分替換。)

?

??????各個部分之間的關系

??????1QuickPagerQuickPager_SQL

??????這個就像SqlCommandSqlConnection的關系一樣。??????

SqlConnection?cn?=?new?SqlConnection();
SqlCommand?cm?
=?new?SqlCommand();
cm.Connection?
=?cn;
cm.Connection.Open();

?

??????同樣,QuickPager 里面一個一個成員的類型就是PagerSQL(也就是QuickPager_SQL)。

??????

??????2QuickPagerDataAccessLibrary

??????他們是通過一個接口(IDALforPager)聯(lián)系在一起的,

??????

Code
public?interface?IDALforPager
????{
????????
///?<summary>
????????
///?傳入SQL語句,返回DataTable的接口
????????
///?</summary>
????????
///?<param?name="sql">SQL語句</param>
????????
///?<returns></returns>
????????DataTable?ExecuteFillDataTable(string?sql);

????????
///?<summary>
????????
///?傳入SQL語句,返回第一條記錄,第一個字段的值的接口
????????
///?</summary>
????????
///?<param?name="sql"></param>
????????
///?<returns></returns>
????????string?ExecuteString(string?sql);

????????
///?<summary>
????????
///?記錄出錯的描述信息
????????
///?</summary>
????????string?ErrorMessage?{?get;?}
???????
????}

?

??????3QuickPager與顯示數(shù)據(jù)的控件

??????為了便于使用,就是說想在使用的時候盡量的少寫代碼,所以我是把顯示數(shù)據(jù)的控件傳遞到了分頁控件里面,然后在需要綁定控件的時候,采用as的方式來判斷是哪種控件,然后在強制轉換,最后實現(xiàn)綁定控件的目的。研究了一下.net里的一些控件的繼承關系,發(fā)現(xiàn)雖然控件很多,但是我只需要做三次判斷就可以了,這就是基類的好處吧。

Code
private?void?DataBind(System.Web.UI.Control?control,?MarshalByValueComponent?dt)
????????{
????????????
if?(control?==?null)
????????????????
return;

????????????
//為什么沒有一個統(tǒng)一的DataSource呢?
????????????BaseDataBoundControl?tmpBaseDataBoundControl?=?control?as?BaseDataBoundControl;
????????????
if?(tmpBaseDataBoundControl?!=?null)
????????????{
????????????????tmpBaseDataBoundControl.DataSource?
=?dt;
????????????????tmpBaseDataBoundControl.DataBind();
????????????}
????????????
else?
????????????{
????????????????Repeater?tmpRepeater?
=?control?as?Repeater;
????????????????
if?(tmpRepeater?!=?null)
????????????????{
????????????????????tmpRepeater.DataSource?
=?dt;
????????????????????tmpRepeater.DataBind();
????????????????}
????????????????
else?
????????????????{
????????????????????BaseDataList?tmpBaseDataList?
=?control?as?BaseDataList;
????????????????????
if?(tmpBaseDataList?!=?null)
????????????????????{
????????????????????????tmpBaseDataList.DataSource?
=?dt;
????????????????????????tmpBaseDataList.DataBind();
????????????????????}
????????????????????
else
????????????????????{
????????????????????????
//不在判斷范圍內,退出
????????????????????????return;
????????????????????}
????????????????}
????????????}

????????}

?

??????4QuickPager_SQLDataAccessLibrary、顯示數(shù)據(jù)的控件沒有任何關系。

?

??????5QuickPagerQuickPager_UI

??????QuickPager_UI 也是分頁控件的一個成員,因為至少有三種分頁方式(PostBackURLXMLHttp),所以呢我采用了基類和子類的方式來實現(xiàn)這種需求,以達到可以隨時擴展的需求。

??

????分頁解決方案從使用方法的角度來說,有兩種方式

????????第一種就是“自動運行”,設置屬性,其他的就不用管了(僅限于QuickPager,其他的分頁控件可能不支持);

????????另一種是“手動運行”,手動運行就要多做一些事情了(其他分頁控件的情況)。

?

????分頁解決方案從提交數(shù)據(jù)的角度,有三種方式。

??????????PostBackURLXMLHttp。當然這三種也是針對于QuickPager來說的,其他的分頁控件是否支持,就看作者的了。

?

????使用方法:

??????時間比較緊,所以這里先說一下使用方法是自動運行、PostBack的情況。

????????????1、一般顯示數(shù)據(jù)

protected?override?void?OnInit(EventArgs?e)
????????
{
????????????
base.OnInitComplete(e);
????????????
//數(shù)據(jù)訪問函數(shù)庫
????????????DataAccessLibrary?dal?=?DALFactory.CreateDAL();
????????????Pager1.DAL?
=?dal;
????????????
????????????
//定義QuickPager_SQL
????????????PagerSQL?pagerSQL?=?PagerSQL.Create(PagerSQLKind.MaxMin);
????????????pagerSQL.Page?
=?this;
????????????Pager1.ManagerPageSQL?
=?pagerSQL;

????????????Pager1.ShowDataControl?
=?this.GV;???????//設置顯示數(shù)據(jù)的控件
????????????
????????}

????????
protected?void?Page_Load(object?sender,?EventArgs?e)
????????
{
????????????
????????????
if?(!Page.IsPostBack)
????????????
{
????????????????SetPagerInfo();?????????
//設置表名、字段名等
????????????}

????????}


????????
給QuickPager_SQL?設置屬性,以便拼接SQL#region?給QuickPager_SQL?設置屬性,以便拼接SQL
????????
private?void?SetPagerInfo()
????????
{
????????????Pager1.ManagerPageSQL.TableName?
=?"News_NewsInfo";??????????//表名或者視圖名稱
????????????Pager1.ManagerPageSQL.TableShowColumns?=?"*";???????????????//需要顯示的字段
????????????Pager1.ManagerPageSQL.TableIDColumn?=?"NewsID";?????????????//主鍵名稱,不支持復合主鍵
????????????Pager1.ManagerPageSQL.TableOrderByColumns?=?"NewsID";?//排序字段,根據(jù)分頁算法而定,可以支持多個排序字段
????????????Pager1.ManagerPageSQL.TableQuery?=?"";??????????????????????//查詢條件

????????????Pager1.PageSize?
=?4;????????????????????????????????????????//一頁顯示的記錄數(shù)

????????}

????????
#endregion

????????????2、查詢數(shù)據(jù)

?處理查詢數(shù)據(jù)的情況#region?處理查詢數(shù)據(jù)的情況
????????
protected?void?Btn_Search_Click(object?sender,?EventArgs?e)
????????
{
????????????
//獲取查詢條件
????????????string?query?=?"";
????????????
string?tmp?=?"";

????????????tmp?
=?this.Txt_Title.TextTrimNone;
????????????
if?(tmp.Length?>?0)
????????????
{
????????????????
if?(query.Length?==?0)
????????????????????query?
=?"?title?like?'%"?+?tmp?+?"%'";
????????????????
else
????????????????????query?
+=?"?and?title?like?'%"?+?tmp?+?"%'";
????????????????
????????????}


????????????
//還可以添加其他的查詢條件,這里省略

????????????
//給QuickPager_SQL?設置查詢條件
????????????this.Pager1.ManagerPageSQL.TableQuery?=?query;??//設置查詢條件
????????????this.Pager1.BindFirstPage();????????????????????//重新綁定控件,顯示第一頁的數(shù)據(jù)

????????}

????????
#endregion

????????????3、添加、修改、刪除后重新顯示數(shù)據(jù)

?添加后重新顯示數(shù)據(jù)#region?添加后重新顯示數(shù)據(jù)
????????
protected?void?Btn_Add_Click(object?sender,?EventArgs?e)
????????
{
????????????
//添加新的數(shù)據(jù)后,顯示第一頁的數(shù)據(jù)
????????????this.Pager1.BindFirstPage();
????????}

????????
#endregion


????????
修改數(shù)據(jù)后重新顯示當前頁的數(shù)據(jù)#region?修改數(shù)據(jù)后重新顯示當前頁的數(shù)據(jù)
????????
protected?void?Btn_Mod_Click(object?sender,?EventArgs?e)
????????
{
????????????
//比如在第三頁修改了一條數(shù)據(jù),修改完畢后,重新顯示第三頁的數(shù)據(jù)。
????????????this.Pager1.BindThisPage();
????????}

????????
#endregion


????????
添加后重新顯示數(shù)據(jù)#region?添加后重新顯示數(shù)據(jù)
????????
protected?void?Btn_Del_Click(object?sender,?EventArgs?e)
????????
{
????????????
//比如在第三頁刪除了一條數(shù)據(jù)后,重新顯示第三頁的數(shù)據(jù)。
????????????
//和修改數(shù)據(jù)后重新顯示的區(qū)別在于,刪除數(shù)據(jù)后需要重新統(tǒng)計總記錄數(shù),和總頁數(shù)
????????????this.Pager1.BindThisPageForDelete();
????????}

????????
#endregion

?

?

??????

?

??????關于三層

??????現(xiàn)在三層還是很流行的,那么我的這個算不算是三層呢?其實算不算對于我來說是無所謂的事情,又沒有誰規(guī)定,現(xiàn)在寫項目必須三層(或者MVC),否則就是不合格產品。既然沒有這個規(guī)定,那么我又為何要在乎是否可以靠到三層結構上呢?

?

??????另外呀,我覺得這么寫代碼挺簡單的,要說簡化,還確實是有簡化的空間,但是說要往三層結構上面靠攏,我還確實不知道應該怎么做。

??????就像http://www.cnblogs.com/wisdomqq/archive/2009/04/29/1446579.html 里說的,“經常看到有的朋友使用三層結構或者MVC模式,比較生硬,強行進行拆分代碼,使得業(yè)務代碼分散在各個角落,反而更難閱讀和維護了。”

???????我覺得這么寫,對于簡單的應用是沒有什么問題的,當然了復雜的情況是有其他的方法來解決的。

?

代碼下載:

http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html

?

ps:今天先寫這么多,以后再詳細說明。

?

總結

以上是生活随笔為你收集整理的分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。