再上数据分页控件(不用存储过程)

简介:

本篇主要内容如下:

·     概述

·     本分页控件原理。

·     分页控件代码。

·     分页控件使用实例。

 


 

 

概述

在前几篇:我介绍了原创企业级控件库之大数据据量分页控件,这个控件主要是通过存储过程进行数据分页,得到了大家的支持,也给出了许多宝贵的建议,在这儿先感谢各位。同时也让我更有信心进行以后的文章(企业级控件库系列)。

分页对于每个项目来说都有它存在的意义,想起在以前刚刚刚软件开发时,由于刚刚毕业,理论知识雄厚,但实际工作经验欠缺,记得几年前做开发时,数据量很大,要用分页,一开始真不知道如何是好,方法到知道,但速度与稳定性却没有经验。在这儿,我只是起到一个抛砖引玉的作用,以便引起我们在实际工作中要多思考,对同一件事多想几种解决方式,只有这样才能不断提高,同时要学会总结。

这篇我将给大家介绍:不用存储过程,直接用代码来实现数据分页,欢迎大家拍砖,觉得不错的可以推荐下。同时,你要用什么好的想法,也可以与我交流,谢谢。

 

 

本分页控件原理

分页的方法很多,有用存储过程的,有不用存储过程的,还有在C#中用DataGridView的虚拟模式的,目的只有一个,对大数据量进行处理,让用户体验得到提高,软件速度得到提升。本分页控件主要是用了下面的SQL语句,我相信你能看懂的,存储过程分页也是用类似的SQL代码:

 

 1  /* TableName           :表名            如:tbTestData
 2    SqlWhereStatement   :Sql Where表达式 如:where表达式为空
 3    PrimaryKey          :主键            如:UniqueID
 4    PageSize            :分页大小        如:50
 5    pageIndex           :当前页          如:8
 6    OrderField          :排序字段        如:InsetDataTime 
 7  */
 8 
 9  SELECT   TOP   50   *   FROM  tbTestData 
10  WHERE   UniqueID  >
11      (
12           SELECT   ISNULL(MAX(id),0FROM 
           (SELECT   TOP   50   *  ( 8-1 ) UniqueID   FROM  tbTestData   ORDER   BY  UniqueID)
13      ) 
14  ORDER   BY  UniqueID 

 

原理就这么简单。

 

 

分页控件代码

       (一)、实例数据库代码

创建实例数据库。

 

CREATE   TABLE   [ tbTestData ] (
    
[ UniqueID ]   [ bigint ]   NOT   NULL ,
    
[ CompanyName ]   [ varchar ] ( 200 NULL ,
    
[ CompanyCode ]   [ varchar ] ( 50 NULL ,
    
[ Address ]   [ varchar ] ( 500 NULL ,
    
[ Owner ]   [ varchar ] ( 100 NULL ,
    
[ Memo ]   [ varchar ] ( 2000 NULL ,
    
[ InsetDataTime ]   [ datetime ]   NULL ,
 
CONSTRAINT   [ PK_tbTestData ]   PRIMARY   KEY   CLUSTERED  
(
    
[ UniqueID ]   ASC
)
WITH  (PAD_INDEX   =   OFF , STATISTICS_NORECOMPUTE   =   OFF , IGNORE_DUP_KEY  =   OFF , ALLOW_ROW_LOCKS   =   ON , ALLOW_PAGE_LOCKS   =   ON ON   [ PRIMARY ]
ON   [ PRIMARY ]

GO

ALTER   TABLE   [ dbo ] . [ tbTestData ]   ADD    CONSTRAINT   [ DF_tbTestData_InsetDataTime ]    DEFAULT  ( getdate ())  FOR   [ InsetDataTime ]
GO

--生成实例数据
declare   @intRowNumber   int ;
select   @intRowNumber   =   1 ;
while   @intRowNumber   <   1000000
begin
    
    
insert   into  tbTestData(UniqueID,CompanyName,CompanyCode,Address,Owner,Memo)
    
values ( @intRowNumber , ' CompanyName '   +   cast ( @intRowNumber   as   varchar ( 2000 )),
           
' CompanyCode '   +   cast ( @intRowNumber   as   varchar ( 2000 )), ' Address ' +   cast ( @intRowNumber   as   varchar ( 2000 )),
           
' Owner '   +   cast ( @intRowNumber   as   varchar ( 2000 )), ' Memo '   +   cast ( @intRowNumber   as   varchar ( 2000 )));    
    
select   @intRowNumber   =   @intRowNumber   +   1
end

(二)、分页控件代码。

 

namespace  DotNet.Controls
{
    
///   <summary>
    
///  分页控件(使用代码实现,不用存储过程)
    
///  UcPageControlByCode
    
///  修改纪录
    
///      
    
///      2010-01-06 胡勇 修改转到某页由原来的KeyPress方法改为KeyDown,让用户按回车键确认转页,以防止连续绑定两次。
    
///      2011-01-06 胡勇 增加对分页控件的初始化代码:public DataTable InitializePageControl()。
    
///      2011-01-05 胡勇 创建分页控件
    
///      2011-04-02 胡勇 优化代码、减少不必要的私有变量,去掉多余的代码
    
///      
    
///   <author>
    
///       <name> 胡勇 </name>
    
///       <QQ> 80368704 </QQ>
    
///       <Email> 80368704@qq.com </Email>
    
///   </author>
    
///   </summary>
    [ToolboxItem( true )]
    [DefaultEvent(
" OnEventPageClicked " )]
    [ToolboxBitmap(
typeof (UcPageControlByCode),  " Images.UcPageControlByCodeIcon.png " )]
    [Description(
" 分页控件(使用代码实现,不用存储过程) " )]
    
public   partial   class  UcPageControlByCode : UserControl
    {
        
#region  私有变量
        
int  recordCount  =   0 // 记录数
         int  pageCount    =   0 // 总页数
         int  pageIndex    =   0 // 当前页
         #endregion

        
#region  自定义事件
        
///   <summary>
        
///  单击分页按钮(第一页、上一页、下一页、最后页、跳页)时发生
        
///   </summary>
        [Category( " UcPageControlByCode " ), Description( " 单击分页按钮时发生 " )]
        
public   event  EventHandler OnEventPageClicked;
        
#endregion

        
#region  自定义属性
        
private   int     _pageSize           =   50 ;              // 分页大小
         private   string  _sqlWhereStatement  =   string .Empty;    // MsSql Where语句
         private   string  _sqlConnString      =   string .Empty;    // MsSql 数据库连接字符串
         private   string  _tableName          =   string .Empty;    // 表名        
         private   string  _orderField         =   string .Empty;    // 数据表的排序字段
         private   string  _primaryKey         =   string .Empty;    // 数据表的主键
         private   string  _queryFieldList     =   " * " ;             // 字段列表(默认为:*)
         private  DataTable _pageTable       =   new  DataTable();
       
        
///   <summary>
        
///  返回当前页码
        
///   </summary>
         public   int  PageIndex
        {
            
get
            {
                
return  pageIndex  +   1 ;
            }
        }

        
///   <summary>
        
///  得到或设置分页大小(默认为:50)
        
///   </summary>
        [Browsable( true ), Category( " UcPageControlByCode " ), Description( " 得到或设置分页大小(默认为:50) " )]
        
public   int  PageSize
        {
            
get
            {
                
return  _pageSize;
            }
            
set
            {
                _pageSize 
=  value;
            }
        }
        
        
///   <summary>
        
///  SQL语句的Where表达式
        
///   </summary>
        [Browsable( false ), Category( " UcPageControlByCode " ), Description( " 得到或设置SQL语句的Where表达式 " )]
        
public   string  SqlWhereStatement
        {
            
get
            {
                
return  _sqlWhereStatement;
            }
            
set
            {
                _sqlWhereStatement 
=  value;
            }
        }
        
        
///   <summary>
        
///  得到或设置SqlServer的连接字符串
        
///   </summary>
        [Browsable( false ), Category( " UcPageControlByCode " ), Description( " 得到或设置SqlServer的连接字符串 " )]
        
public   string  SqlConnString
        {
            
get
            {
                
return  _sqlConnString;
            }
            
set
            {
                _sqlConnString 
=  value;
            }
        }

        
///   <summary>
        
///  得到用户单击分页按钮后返回的DataTable
        
///   </summary>
        [Browsable( false ), Category( " UcPageControlByCode " ), Description( " 得到用户单击分页按钮后返回的DataTable " )]
        
public  DataTable PageTable
        {
            
get
            {
                
return  _pageTable;
            }
        }
        
        
///   <summary>
        
///  设置或得到与分页控件绑定的表名或视图名
        
///   </summary>
        [Browsable( true ), Category( " UcPageControlByCode " ), Description( " 设置或得到与分页控件绑定的表名或视图名 " )]
        
public   string  TableName
        {
            
get
            {
                
return  _tableName;
            }
            
set
            {
                _tableName 
=  value;
            }
        }
        
        
///   <summary>
        
///  设置或得到分页控件排序字段
        
///   </summary>
        [Browsable( true ), Category( " UcPageControlByCode " ), Description( " 设置或得到分页控件排序字段 " )]
        
public   string  OrderField
        {
            
get
            {
                
return  _orderField;
            }
            
set
            {
                _orderField 
=  value;
            }
        }
        
        
///   <summary>
        
///  设置或得到分页控件绑定数据表的主键
        
///   </summary>
        [Browsable( true ), Category( " UcPageControlByCode " ), Description( " 设置或得到分页控件绑定数据表的主键 " )]
        
public   string  PrimaryKey
        {
            
get
            {
                
return  _primaryKey;
            }
            
set
            {
                _primaryKey 
=  value;
            }
        }
        
        
///   <summary>
        
///  设置或得到分页控件绑定的字段列表(默认为:*)
        
///   </summary>
        [Browsable( true ), Category( " UcPageControlByCode " ), Description( " 设置或得到分页控件绑定的字段列表(默认为:*) " )]
        
public   string  QueryFieldList
        {
            
get
            {
                
return  _queryFieldList;
            }
            
set
            {
                _queryFieldList 
=  value;
            }
        }
        
#endregion

        
#region  构造函数
        
///   <summary>
        
///  分页控件(使用代码实现,不用存储过程)
        
///   </summary>
         public  UcPageControlByCode()
        {
            InitializeComponent();
        }
        
#endregion

        
#region  分页实现相关代码

        
#region  void SetUcPageControlPars(string connStr, string whereStatement, string tbName, string orderField, string primaryKeyName, string fieldList):给UcPageControlByCode控件传递必需参数
        
///   <summary>
        
///  给UcPageControlByCode控件传递必需参数
        
///   </summary>
        
///   <param name="connStr"> 连接字符串 </param>
        
///   <param name="whereStatement"> MsSql Where语句  </param>
        
///   <param name="tbName"> 数据表名或视力名 </param>
        
///   <param name="orderField"> 排序字段 </param>
        
///   <param name="primaryKeyName"> 主键值 </param>
        
///   <param name="fieldList"> 字段列表(默认为:*) </param>
         public   void  SetUcPageControlPars( string  connStr,  string  whereStatement,  string  tbName
                                       , 
string  orderField,  string  primaryKeyName,  string  fieldList)
        {
            
if  ( string .IsNullOrEmpty(connStr.Trim()))
            {
                DialogHelper.ShowErrorMsg(
" 温馨提示:\n无可用的数据库连接! " );
                
return ;
            }
            
else
            {
                
this .SqlConnString  =  connStr;
            }
            
this .SqlWhereStatement  =  whereStatement;
            
this .TableName  =  tbName;
            
this .OrderField  =  orderField;
            
this .PrimaryKey  =  primaryKeyName;
            
if  ( ! string .IsNullOrEmpty(fieldList.Trim()))
            {
                
this .QueryFieldList  =  fieldList;
            }
        }
        
#endregion

        
#region  DataTable InitializePageControl():初始化UcPageControlByCode
        
///   <summary>
        
///  绑定UcPageControlByCode(并返回包含当前页的DataTable)
        
///   </summary>
        
///   <returns> DataTable </returns>
         public  DataTable BindPageControl()
        {
            recordCount       
=  GetTotalRecordCount();                            // 获取总记录数  
            pageCount          =  recordCount  /  PageSize  -  ModPage();               // 保存总页数(减去ModPage()函数防止SQL语句执行时溢出查询范围,可以用存储过程分页算法来理解这句) 
            pageIndex          =   0 ;                                                // 保存一个为0的页面索引值到pageIndex   
            lblPageCount.Text  =  (recordCount  /  PageSize  +  OverPage()).ToString(); // 显示lblpageCount、lblrecCount的状态   
            lblRecCount.Text   =  recordCount.ToString();
                
            
if  (recordCount  <=  PageSize)
            {
                txtGoToPage.Enabled 
=   false ;
            }
            
else
            {
                txtGoToPage.Enabled 
=   true ;
            }

            
return  TDataBind();  
        }
        
#endregion

 

         #region  余页计算与总记录数
        
///   <summary>
        
///  计算余页
        
///   </summary>
        
///   <returns></returns>          
         private   int  OverPage()
        {
            
int  returnValue  =   0 ;

            
if  (recordCount  %  PageSize  !=   0 )
            {
                returnValue 
=   1 ;
            }          

            
return  returnValue;
        }

        
///   <summary>
        
///  计算余页,防止SQL语句执行时溢出查询范围   
        
///   </summary>
        
///   <returns></returns>
         private   int  ModPage()
        {
            
int  returnValue  =   0 ;

            
if  (recordCount  %  PageSize  ==   0   &&  recordCount  !=   0 )
            {
                returnValue 
=   1 ;
            }
            
            
return  returnValue;
        }

        
///   <summary>
        
///  计算总记录数
        
///   </summary>
        
///   <returns> 记录总数 </returns>  
         private   int  GetTotalRecordCount()
        {
            
int  returnValue      =   0 ;
            
string  sqlStatement  =   " select count(1) as rowsCount from  "   +  TableName; 

            
if  (SqlWhereStatement.Trim().Length  >   0 )
            {
                sqlStatement 
=   " select count(1) as rowsCount from  "   +  TableName  +   "  where  "   +  SqlWhereStatement;
            }

            SqlDataReader dr 
=   null ;
            
try
            {
                dr 
=  DbHelperSQL.ExecuteReader(sqlStatement, SqlConnString);
                
if  (dr.Read())
                {
                    returnValue 
=  Int32.Parse(dr[ " rowsCount " ].ToString());
                }
                
            }
            
catch (Exception ex)
            {
                DialogHelper.ShowErrorMsg(ex.Message);
            }
            
finally
            {
                dr.Close();
                dr.Dispose();
            }

            
return  returnValue;
        }
        
#endregion

        
#region  DataTable TDataBind():数据绑定
        
private  DataTable TDataBind()
        {
            StringBuilder sbSqlStatement 
=   new  StringBuilder();
            
bool  isForward   =  pageIndex  +   1   >   1 ;
            
bool  isBackward  =  (pageIndex  !=  pageCount);
            btnFirstPage.Enabled 
=  isForward;
            btnPrevPage.Enabled  
=  isForward;            
            btnNextPage.Enabled  
=  isBackward;
            btnLastPage.Enabled  
=  isBackward;            

            
if  ( string .IsNullOrEmpty(SqlWhereStatement.Trim()))
            {
                sbSqlStatement.Append(
" SELECT TOP  "   +  PageSize  +   "    "   +  QueryFieldList  +   "  FROM  "   +  TableName  +   "  WHERE  "   +  PrimaryKey  +   "  NOT IN(SELECT TOP  " );
                sbSqlStatement.Append(PageSize 
*  pageIndex  +   "    "   +  PrimaryKey  +   "  FROM  "   +  TableName);
                sbSqlStatement.Append(
"  ORDER BY  "   +  OrderField  + "  DESC) ORDER BY  "   +  OrderField  +   "  DESC " );
            }
            
else
            {
                sbSqlStatement.Append(
" SELECT TOP  "   +  PageSize  +   "    "   +  QueryFieldList  +   "  FROM  "   +  TableName  +   "  WHERE  "   +  SqlWhereStatement  +   "  AND  "   +  PrimaryKey  +   "  NOT IN(SELECT TOP  " );
                sbSqlStatement.Append(PageSize 
*  pageIndex  +   "    "   +  PrimaryKey  +   "   FROM  "   +  TableName  +   "  WHERE  "   +  SqlWhereStatement  +   "   ORDER BY  "   +  OrderField  +   "  DESC) ORDER BY  "   +  OrderField  +   "  DESC " );
            }

            _pageTable          
=  DbHelperSQL.Query(sbSqlStatement.ToString(), SqlConnString).Tables[ 0 ];
            lblCurrentPage.Text 
=  (pageIndex  +   1 ).ToString();
            txtGoToPage.Text    
=  (pageIndex  +   1 ).ToString();
            
return  _pageTable;
        }
        
#endregion

        
#region  按钮事件代码
        
private   void  btnFirstPage_Click( object  sender, EventArgs e)
        {
            pageIndex  
=   0 ;            
            _pageTable 
=  TDataBind();

            
if  (OnEventPageClicked  !=   null )
            {
                OnEventPageClicked(
this null );
            }
        }

        
private   void  btnPrevPage_Click( object  sender, EventArgs e)
        {
            pageIndex
-- ;             
            _pageTable 
=  TDataBind();

            
if  (OnEventPageClicked  !=   null )
            {
                OnEventPageClicked(
this null );
            }
        }

        
private   void  btnNextPage_Click( object  sender, EventArgs e)
        {
            pageIndex
++ ;
            _pageTable 
=  TDataBind();

            
if  (OnEventPageClicked  !=   null )
            {
                OnEventPageClicked(
this null );
            }
        }

        
private   void  btnLastPage_Click( object  sender, EventArgs e)
        {
            pageIndex  
=  pageCount;       
            _pageTable 
=  TDataBind();

            
if  (OnEventPageClicked  !=   null )
            {
                OnEventPageClicked(
this null );
            }
        }

        
private   void  txtGoToPage_KeyDown( object  sender, KeyEventArgs e)
        {
            
if  (e.KeyCode  ==  Keys.Enter)
            {
                
try
                {                                  
                    
if  (Int32.Parse(txtGoToPage.Text)  >  (recordCount  /  PageSize  +  OverPage())  ||  Int32.Parse(txtGoToPage.Text)  <=   0 )
                    {
                        DialogHelper.ShowWarningMsg(
" 页码范围越界! " );
                        txtGoToPage.Clear();
                        txtGoToPage.Focus();
                    }
                    
else
                    {
                        pageIndex  
=  Int32.Parse(txtGoToPage.Text.ToString())  -   1 ;
                        _pageTable 
=  TDataBind();

                        
if  (OnEventPageClicked  !=   null )
                        {
                            OnEventPageClicked(
this null );
                        }
                    }
                }
                
catch  (Exception ex)  // 捕获由用户输入不正确数据类型时造成的异常    
                {
                    DialogHelper.ShowWarningMsg(ex.Message);
                    txtGoToPage.Clear();
                    txtGoToPage.Focus();
                }
            }
        }
        
#endregion

        
#endregion
    }
}

 

 

分页控件使用实例

     客户端使用代码如下:

     

View Code
 1  using  System;
 2  using  System.Collections.Generic;
 3  using  System.ComponentModel;
 4  using  System.Data;
 5  using  System.Drawing;
 6  using  System.Configuration;
 7  using  DotNet.Controls;
 8  using  System.Text;
 9  using  System.Windows.Forms;
10  using  DotNet.Common;
11  using  DotNet.WinForm.Utilities;
12 
13  namespace  DotNet.WinForm.Example
14  {
15       public   partial   class  FrmUcPageControlByCodeTest : Form
16      {
17           public  FrmUcPageControlByCodeTest()
18          {
19              InitializeComponent();
20          }
21 
22           private   void  FrmUcPageControlByCodeTest_Shown( object  sender, EventArgs e)
23          {
24               // 初始化方法一
25               // ucPageControlByCode.SqlConnString = ConfigurationSettings.AppSettings["DbConnection"];
26               // ucPageControlByCode.SqlWhereStatement = "1=1";
27               // ucPageControlByCode.TableName = "tbTestData";
28               // ucPageControlByCode.OrderField = "UniqueID";
29               // ucPageControlByCode.PrimaryKey = "UniqueID";
30               // ucPageControlByCode.QueryFieldList = "*";
31 
32               // 初始化方法二
33              ucPageControlByCode.SetUcPageControlPars(ConfigurationSettings.AppSettings[ " DbConnection " ],  " 1=1 " " tbTestData " ,
34                   " UniqueID " " UniqueID " " * " );
35              DataTable dtTest  =   new  DataTable();
36              dtTest  =  ucPageControlByCode.BindPageControl();
37              ucDataGridView.DataSource  =  dtTest;
38 
39               // 绑定查询项
40              Dictionary < string string >  dicListQueryItems  =   new  Dictionary < string string > ();
41               foreach  (DataColumn dc  in  dtTest.Columns)
42              {
43                  dicListQueryItems.Add(dc.ColumnName, dc.DataType.ToString());
44              }
45              ucCombinQuery1.SetQueryItems(dicListQueryItems);
46          }
47 
48           private   void  ucDataGridView_DataBindingComplete( object  sender, DataGridViewBindingCompleteEventArgs e)
49          {
50              gbMain.Text  =   " 当前共: "   +  ucDataGridView.Rows.Count.ToString()  +   " 条数据。 " ;
51          }
52 
53           private   void  ucPageControlByCode_OnEventPageClicked( object  sender, EventArgs e)
54          {
55              ucDataGridView.DataSource  =   null ;
56              ucDataGridView.DataSource  =  ucPageControlByCode.PageTable;
57          }
58 
59           private   void  ucCombinQuery1_OnQueryClicked( object  sender, EventArgs e)
60          {
61               try
62              {
63                  Splasher.Show( typeof (FrmSplash));
64                  Splasher.Status  =   " 正在查找数据,请稍等... " ;
65                  System.Threading.Thread.Sleep( 450 );
66                  ucDataGridView.DataSource  =   null ;
67                  ucPageControlByCode.SqlWhereStatement  =  ucCombinQuery1.QueryExpression;  // 指定查询表达式
68                  ucDataGridView.DataSource  =  ucPageControlByCode.BindPageControl();  // 绑定DataGridView
69              }
70               catch  (Exception ex)
71              {
72                  ucPageControlByCode.SqlWhereStatement  =   " 1<>1 " ;
73                  ucDataGridView.DataSource  =  ucPageControlByCode.BindPageControl();  // 绑定DataGridView
74                  Splasher.Status  =  ex.Message;
75                  System.Threading.Thread.Sleep( 1000 );
76              }
77               finally
78              {
79                  System.Threading.Thread.Sleep( 100 );
80                  Splasher.Status  =   " 查找完毕... " ;               
81                  Splasher.Close();                
82              }
83          }
84      }
85  }

 

     最后的效果如下:

 本文转自yonghu86 51CTO博客,原文链接:http://blog.51cto.com/yonghu/1321362,如需转载请自行联系原作者

 

相关文章
|
8月前
|
存储
SQLServer分页获取数据的存储过程
SQLServer分页获取数据的存储过程
29 0
|
8月前
|
存储 开发框架 前端开发
基于MySQL 实现通用分页存储过程(下篇-超详细)(上)
基于MySQL 实现通用分页存储过程(下篇-超详细)
75 0
|
8月前
|
存储 XML 安全
基于MySQL 实现通用分页存储过程(下篇-超详细)(下)
基于MySQL 实现通用分页存储过程(下篇-超详细)
44 0
|
11月前
|
存储
SqlServer存储过程应用二:分页查询数据并动态拼接where条件 (下)
SqlServer存储过程应用二:分页查询数据并动态拼接where条件 (下)
|
11月前
|
存储 SQL 数据库连接
SqlServer存储过程应用二:分页查询数据并动态拼接where条件 (上)
SqlServer存储过程应用二:分页查询数据并动态拼接where条件
|
11月前
|
存储
【干货】SqlServer 总结几种存储过程分页的使用
【干货】SqlServer 总结几种存储过程分页的使用
|
存储 SQL Perl
PL/SQL编程—分页功能(存储过程)
PL/SQL编程—分页功能(存储过程)
93 0
|
存储
通用分页存储过程,干货无污染
通用分页存储过程,干货无污染
|
存储 关系型数据库 MySQL
【MySQL】使用存储过程+IF控制语句批量添加数据
【MySQL】使用存储过程+IF控制语句批量添加数据
245 0
【MySQL】使用存储过程+IF控制语句批量添加数据
使用存储过程批量更新单表中的数据
使用存储过程批量更新单表中的数据