ASP.net 2.0 自定义控件的开发之数据分页 第三章

控件的属性及事件定义

   Private   Shared   ReadOnly  EventibGotoPageClick  As   New   Object ()
        
Private   Shared   ReadOnly  EventlbGotoPageClick  As   New   Object ()

        
Private  Conn  As  SqlConnection
        
Private  _StoredProcedureName  As   String
        
Private  _ControlToDataBind  As   String
        
Private  _GoToStyle  As  StyleGoTo  =  StyleGoTo.LinkButton

        
Private  intPageCount  As  Int32  =   0
        
Private  intRecordCount  As  Int32  =   0
        
Private  intPageSize  As  Int32

        
Private  _DefaultImageUrl  As   String
        
Private  _HoverImageUrl  As   String
        
Private  _PressedImageUrl  As   String

        
Private  _controlToPaginat  As  Control
        
Private  labPageInfo  As  Label
        
Private  labPageInfoText_01  As  Label
        
Private  labPageInfoText_02  As  Label
        
Private  labPageInfoText_03  As  Label
        
Private  labPageInfoText_04  As  Label

        
Private  txtPageSize  As  TextBox
        
Private  txtPageIndex  As  TextBox
        
Private  ibGotoPage  As  ImageButton
        
Private  lbGotoPage  As  LinkButton

        
Private  lbFirstPage  As  LinkButton
        
Private  lbPrevPage  As  LinkButton
        
Private  lbNextPage  As  LinkButton
        
Private  lbLastPage  As  LinkButton


属性定义 #Region "属性定义"
        
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        < _
        Bindable(
True), _
        Category(
"PageInfo"), _
        DefaultValue(
""), _
        Description(
"设置页的信息(例如:当前 100 条记录...).") _
        
> _
        
Public Property PageInfoText()Property PageInfoText() As String
            
Get
                EnsureChildControls()
                
Return labPageInfo.Text
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                labPageInfo.Text 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"PageInfo"), _
        DefaultValue(
""), _
        Description(
"设置显示 每页 字符.") _
        
> _
        
Public Property PageInfoText_01()Property PageInfoText_01() As String
            
Get
                EnsureChildControls()
                
Return labPageInfoText_01.Text
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                labPageInfoText_01.Text 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"PageInfo"), _
        DefaultValue(
""), _
        Description(
"设置显示 条记录 字符.") _
        
> _
        
Public Property PageInfoText_02()Property PageInfoText_02() As String
            
Get
                EnsureChildControls()
                
Return labPageInfoText_02.Text
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                labPageInfoText_02.Text 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"PageInfo"), _
        DefaultValue(
""), _
        Description(
"设置显示 转到 字符.") _
        
> _
        
Public Property PageInfoText_03()Property PageInfoText_03() As String
            
Get
                EnsureChildControls()
                
Return labPageInfoText_03.Text
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                labPageInfoText_03.Text 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"PageInfo"), _
        DefaultValue(
""), _
        Description(
"设置显示 页 字符.") _
        
> _
        
Public Property PageInfoText_04()Property PageInfoText_04() As String
            
Get
                EnsureChildControls()
                
Return labPageInfoText_04.Text
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                labPageInfoText_04.Text 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Style"), _
        DefaultValue(
""), _
        Description(
"页大小 Textbox 边框的宽度.") _
        
> _
        
Public Property TextboxBorderWidth()Property TextboxBorderWidth() As Unit
            
Get
                EnsureChildControls()
                
Return txtPageSize.BorderWidth
            
End Get
            
Set(ByVal value As Unit)
                EnsureChildControls()
                txtPageSize.BorderWidth 
= value
                txtPageIndex.BorderWidth 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Style"), _
        DefaultValue(
""), _
        Description(
"页大小 Textbox 边框的颜色.") _
        
> _
        
Public Property TextboxBorderColor()Property TextboxBorderColor() As System.Drawing.Color
            
Get
                EnsureChildControls()
                
Return txtPageSize.BorderColor
            
End Get
            
Set(ByVal value As System.Drawing.Color)
                EnsureChildControls()
                txtPageSize.BorderColor 
= value
                txtPageIndex.BorderColor 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Style"), _
        DefaultValue(
""), _
        Description(
"页大小 Textbox 的SkinID.") _
        
> _
        
Public Property TextboxSkinID()Property TextboxSkinID() As String
            
Get
                EnsureChildControls()
                
Return txtPageSize.SkinID
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                txtPageSize.SkinID 
= value
                txtPageIndex.SkinID 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Style"), _
        DefaultValue(
""), _
        Description(
"设置转到的的风格.") _
        
> _
        
Public Property GoToStyle()Property GoToStyle() As StyleGoTo
            
Get
                EnsureChildControls()
                
Return Me._GoToStyle
            
End Get
            
Set(ByVal value As StyleGoTo)
                EnsureChildControls()
                
Me._GoToStyle = value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Style"), _
        DefaultValue(
""), _
        Description(
"设置转到的按钮默认图片.") _
        
> _
        
Public Property DefaultImageUrl()Property DefaultImageUrl() As String
            
Get
                EnsureChildControls()
                
Return ibGotoPage.ImageUrl

            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                ibGotoPage.ImageUrl 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Style"), _
        DefaultValue(
""), _
        Description(
"设置当鼠标指针在按钮上时显示的图片.") _
        
> _
        
Public Property HoverImageUrl()Property HoverImageUrl() As String
            
Get
                EnsureChildControls()
                
Return Me._HoverImageUrl

            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                
Me._HoverImageUrl = value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Style"), _
        DefaultValue(
""), _
        Description(
"设置当鼠标按下时显示的图片.") _
        
> _
        
Public Property PressedImageUrl()Property PressedImageUrl() As String
            
Get
                EnsureChildControls()
                
Return Me._PressedImageUrl

            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                
Me._PressedImageUrl = value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Size"), _
        DefaultValue(
""), _
        Description(
"设置 PageSize 文本框宽度.") _
        
> _
        
Public Property PageSizeWidth()Property PageSizeWidth() As Unit
            
Get
                EnsureChildControls()
                
Return txtPageSize.Width

            
End Get
            
Set(ByVal value As Unit)
                EnsureChildControls()
                txtPageSize.Width 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Size"), _
        DefaultValue(
""), _
        Description(
"设置 PageIndex 文本框宽度.") _
        
> _
        
Public Property PageIndexWidth()Property PageIndexWidth() As Unit
            
Get
                EnsureChildControls()
                
Return txtPageIndex.Width

            
End Get
            
Set(ByVal value As Unit)
                EnsureChildControls()
                txtPageIndex.Width 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Size"), _
        DefaultValue(
""), _
        Description(
"设置 转到 按钮的宽度.") _
        
> _
        
Public Property ibGotoPageWidth()Property ibGotoPageWidth() As Unit
            
Get
                EnsureChildControls()
                
Return ibGotoPage.Width

            
End Get
            
Set(ByVal value As Unit)
                EnsureChildControls()
                ibGotoPage.Width 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Size"), _
        DefaultValue(
""), _
        Description(
"设置 转到 按钮的高度.") _
        
> _
        
Public Property ibGotoPageHeight()Property ibGotoPageHeight() As Unit
            
Get
                EnsureChildControls()
                
Return ibGotoPage.Height

            
End Get
            
Set(ByVal value As Unit)
                EnsureChildControls()
                ibGotoPage.Height 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Text"), _
        DefaultValue(
""), _
        Description(
"设置 转到 链接按钮的文字.") _
        
> _
        
Public Property lbGotoPageText()Property lbGotoPageText() As String
            
Get
                EnsureChildControls()
                
Return lbGotoPage.Text
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                lbGotoPage.Text 
= value
            
End Set
        
End Property


        
< _
        Bindable(
True), _
        Category(
"Database"), _
        DefaultValue(
""), _
        Description(
"设置链接数据库的字符串.") _
        
> _
        
Public Property SQLConnection()Property SQLConnection() As String
            
Get
                EnsureChildControls()
                
Return ViewState("SQLConnection")
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                ViewState(
"SQLConnection"= value
            
End Set
        
End Property

        
< _
            Bindable(
True), _
            Category(
"Database"), _
            DefaultValue(
""), _
            Description(
"设置表名.") _
            
> _
        
Public Property TableName()Property TableName() As String
            
Get
                EnsureChildControls()
                
Return ViewState("TableName")
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                ViewState(
"TableName"= value
            
End Set
        
End Property


        
< _
            Bindable(
True), _
            Category(
"Database"), _
            DefaultValue(
""), _
            Description(
"设置分页数据的主键.") _
            
> _
        
Public Property PrimaryKeyField()Property PrimaryKeyField() As String
            
Get
                EnsureChildControls()
                
Return ViewState("PrimaryKeyField")
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                ViewState(
"PrimaryKeyField"= value
            
End Set
        
End Property


        
< _
            Bindable(
True), _
            Category(
"Database"), _
            DefaultValue(
""), _
            Description(
"设置返回的字段.") _
            
> _
        
Public Property Field()Property Field() As String
            
Get
                EnsureChildControls()
                
Return ViewState("Field")
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                ViewState(
"Field"= value
            
End Set
        
End Property


        
< _
            Bindable(
True), _
            Category(
"Database"), _
            DefaultValue(
""), _
            Description(
"设置 WHERE 条件.") _
            
> _
        
Public Property Where()Property Where() As String
            
Get
                EnsureChildControls()
                
Return ViewState("Where")
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                ViewState(
"Where"= value
            
End Set
        
End Property


        
< _
            Browsable(
True), _
            Category(
"Database"), _
            DefaultValue(
""), _
            Description(
"设置排序方式.") _
            
> _
        
Public Property OrderBy()Property OrderBy() As String
            
Get
                EnsureChildControls()
                
Return ViewState("OrderBy")
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                ViewState(
"OrderBy"= value
            
End Set
        
End Property


        
< _
            Bindable(
True), _
            Category(
"Database"), _
            DefaultValue(
""), _
            Description(
"设置分组方式.") _
            
> _
        
Public Property GroupBy()Property GroupBy() As String
            
Get
                EnsureChildControls()
                
Return ViewState("GroupBy")
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                ViewState(
"GroupBy"= value
            
End Set
        
End Property


        
< _
            Bindable(
True), _
            Category(
"Database"), _
            DefaultValue(
""), _
            TypeConverter(
GetType(ControlToDataBindConverter)), _
            Description(
"设置要分页的控件.") _
            
> _
                
Public Property ControlToPaginate()Property ControlToPaginate() As String
            
Get
                EnsureChildControls()
                
Return ViewState("ControlToPaginate")
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                ViewState(
"ControlToPaginate"= value
            
End Set
        
End Property


        
< _
            Bindable(
True), _
            Category(
"Database"), _
            DefaultValue(
1), _
            Description(
"设置当前页.") _
            
> _
        
Public Property CurrentPageIndex()Property CurrentPageIndex() As Int32
            
Get
                EnsureChildControls()
                
Return ViewState("CurrentPageIndex")
            
End Get
            
Set(ByVal value As Int32)
                EnsureChildControls()
                ViewState(
"CurrentPageIndex"= value
            
End Set
        
End Property


        
< _
            Bindable(
True), _
            Category(
"Database"), _
            DefaultValue(
""), _
            Description(
"每页显示数据的大小.") _
            
> _
        
Public Property PageSize()Property PageSize() As Int32
            
Get
                EnsureChildControls()
                
If Not IsNumeric(txtPageSize.Text) Then
                    txtPageSize.Text 
= 10
                
Else
                    
If CInt(txtPageSize.Text) < 1 Then
                        txtPageSize.Text 
= 10
                    
End If
                
End If
                
Return CInt(txtPageSize.Text)
            
End Get
            
Set(ByVal value As Int32)
                EnsureChildControls()
                txtPageSize.Text 
= value
            
End Set
        
End Property


        
< _
             Bindable(
True), _
             Category(
"Database"), _
             DefaultValue(
""), _
             Description(
"将要转到的页数.") _
             
> _
        
Public Property PageIndex()Property PageIndex() As String
            
Get
                EnsureChildControls()
                
Return txtPageIndex.Text
            
End Get
            
Set(ByVal value As String)
                EnsureChildControls()
                txtPageIndex.Text 
= value
            
End Set
        
End Property


        
< _
            Bindable(
False), _
            Category(
"Database"), _
            DefaultValue(
""), _
            TypeConverter(
GetType(StoredProcedureNameConverter)), _
            Description(
"选择存储过程。") _
            
> _
        
Public Property StoredProcedureName()Property StoredProcedureName() As String
            
Get
                
Return _StoredProcedureName
            
End Get
            
Set(ByVal Value As String)
                _StoredProcedureName 
= Value
            
End Set
        
End Property


        
< _
            Bindable(
False), _
            Category(
"About"), _
            DefaultValue(
""), _
            Description(
"作者:江建 QQ:33512603" & vbCrLf & "编程浪子:http://vbcc.126.com") _
            
> _
       
Public ReadOnly Property About()Property About() As String
            
Get
                
Return "作者:江建 QQ:33512603" & vbCrLf & "编程浪子:http://vbcc.126.com"
            
End Get
        
End Property


        
<Browsable(False)> _
        
Public ReadOnly Property PageCount()Property PageCount() As Int32
            
Get
                EnsureChildControls()
                
Return ViewState("PageCount")
            
End Get
        
End Property


        
<Browsable(False)> _
        
Public ReadOnly Property RecordCount()Property RecordCount() As Int32
            
Get
                EnsureChildControls()
                
Return ViewState("RecordCount")
            
End Get
        
End Property


        
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#End Region


事件定义 #Region "事件定义"
        
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
        Private Sub ibGotoPage_Click()Sub ibGotoPage_Click(ByVal sender As ObjectByVal e As ImageClickEventArgs)
            
If Not IsNumeric(PageIndex) Then
                PageIndex 
= CurrentPageIndex
            
End If
            
If PageIndex < 1 Then
                PageIndex 
= 1
            
ElseIf PageIndex > PageCount Then
                PageIndex 
= PageCount
            
End If
            CurrentPageIndex 
= PageIndex
            
Call DataBind()
        
End Sub


        
Private Sub lbGotoPage_Click()Sub lbGotoPage_Click(ByVal source As ObjectByVal e As EventArgs)
            
If Not IsNumeric(PageIndex) Then
                PageIndex 
= CurrentPageIndex
            
End If
            
If PageIndex < 1 Then
                PageIndex 
= 1
            
ElseIf PageIndex > PageCount Then
                PageIndex 
= PageCount
            
End If
            CurrentPageIndex 
= PageIndex
            
Call DataBind()
        
End Sub


        
Private Sub lbFirstPage_Click()Sub lbFirstPage_Click(ByVal source As ObjectByVal e As EventArgs)
            CurrentPageIndex 
= 1
            
Call DataBind()
        
End Sub


        
Private Sub lbPrevPage_Click()Sub lbPrevPage_Click(ByVal source As ObjectByVal e As EventArgs)
            
If CurrentPageIndex > 1 Then
                CurrentPageIndex 
-= 1
            
End If
            
Call DataBind()
        
End Sub


        
Private Sub lbNextPage_Click()Sub lbNextPage_Click(ByVal source As ObjectByVal e As EventArgs)
            
If CurrentPageIndex < PageCount Then
                CurrentPageIndex 
+= 1
            
End If
            
Call DataBind()
        
End Sub


        
Private Sub lbLastPage_Click()Sub lbLastPage_Click(ByVal source As ObjectByVal e As EventArgs)
            CurrentPageIndex 
= PageCount
            
Call DataBind()
        
End Sub


        
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#End Region

 下面的代码用于控件的下拉列表属性页

Public   Class StoredProcedureNameConverter Class StoredProcedureNameConverter
        
Inherits StringConverter
        
'存储过程 有兴趣可以添加你自己的存储过程
        '要用下拉列表编辑属性 
        Public Overrides Function GetStandardValuesSupported()Function GetStandardValuesSupported(ByVal context As ITypeDescriptorContext) As Boolean
            
Return True
        
End Function


        
'这个override返回下拉列表项。 
        Public Overrides Function GetStandardValues()Function GetStandardValues(ByVal context As ITypeDescriptorContext) As StandardValuesCollection
            
Dim StringArray As ArrayList = New ArrayList()
            StringArray.Add(
"sys_QuickSortPaging")
            StringArray.Add(
"sys_SortDataPager")
            
Return New StandardValuesCollection(StringArray)
        
End Function



        
'Return True的话只能选,Return flase可选可填 
        Public Overrides Function GetStandardValuesExclusive()Function GetStandardValuesExclusive(ByVal context As ITypeDescriptorContext) As Boolean
            
Return True
        
End Function

    
End Class


    
Public   Class ControlToDataBindConverter Class ControlToDataBindConverter
        
Inherits StringConverter
        
'列出可以绑定的控件
        '要用下拉列表编辑属性 
        Public Overrides Function GetStandardValuesSupported()Function GetStandardValuesSupported(ByVal context As ITypeDescriptorContext) As Boolean
            
Return True
        
End Function


        
'这个override返回下拉列表项。 
        Public Overrides Function GetStandardValues()Function GetStandardValues(ByVal context As ITypeDescriptorContext) As StandardValuesCollection
            
Dim StringArray As ArrayList = New ArrayList()
            
Dim I As Long
            
Dim objControl As ControlCollection
            objControl 
= CType(context.Container.Components(0), Page).Controls
            
For I = 0 To objControl.Count - 1
                
If TypeOf objControl(I) Is GridView Or TypeOf objControl(I) Is DataList Then
                    StringArray.Add(objControl(I).ClientID)
                
End If
            
Next
            
Return New StandardValuesCollection(StringArray)
        
End Function



        
'Return True的话只能选,Return false可选可填 
        Public Overrides Function GetStandardValuesExclusive()Function GetStandardValuesExclusive(ByVal context As ITypeDescriptorContext) As Boolean
            
Return False
        
End Function

    
End Class

存储过程 为 SQL Server 2000版本,请打开SQL server 2000 的查询分析器执行下面的SQL 语句。
程序用到的存储过程(仅支持主键排序)

if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[sys_QuickSortPaging] ' and   OBJECTPROPERTY (id, N ' IsProcedure ' =   1 )
drop   procedure   [ dbo ] . [ sys_QuickSortPaging ]
GO

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO

CREATE   PROCEDURE   sys_QuickSortPaging

    
@Table   nvarchar ( 4000 ),             -- 表名(必须)
     @PrimaryKeyField   nvarchar ( 50 ),         -- 表的主键字段
     @Field   nvarchar  ( 4000 ) = ' * ' ,          -- 需要返回字段名(必须)        
     @Where   nvarchar ( 1000 ) = NULL ,         -- Where 条件(可选)
              @GroupBy   nvarchar ( 1000 =   NULL ,      -- 分组
     @OrderBy   nvarchar ( 1000 ) = NULL ,      -- 排序用到的字段()
     @PageNumber   int   =   1 ,              -- 要返回的页(第X页) (默认为第一页)
     @PageSize   int   =   10 ,             -- 每页大小(默认为5)
     @RecordCount   int  output         -- 返回记录总数
)
AS  
    
SET  NOCOUNT  ON
    
DECLARE   @SortTable   nvarchar ( 100 )
    
DECLARE   @SortName   nvarchar ( 100 )
    
DECLARE   @strSortColumn   nvarchar ( 200 )
    
DECLARE   @Operator   nvarchar ( 50 )
    
DECLARE   @Type   varchar ( 100 )
    
DECLARE   @Prec   int

    
IF   @OrderBy   IS   NULL   OR   @OrderBy   =   ''
    
SET   @OrderBy   =    @PrimaryKeyField     
    
    
/**/ /* 获取用于定位的字段*/                 
    
IF   CHARINDEX ( ' DESC ' , @OrderBy ) > 0                         
        
BEGIN
            
SET   @strSortColumn   =   REPLACE ( @OrderBy ' DESC ' '' )
            
SET   @Operator   =   ' <= '
        
END
    
ELSE
        
BEGIN
            
IF   CHARINDEX ( ' ASC ' @OrderBy =   0
            
SET   @strSortColumn   =   REPLACE ( @OrderBy ' ASC ' '' )
            
SET   @Operator   =   ' >= '
        
END
    
    
IF   CHARINDEX ( ' . ' @strSortColumn >   0                         
        
BEGIN
            
SET   @SortTable   =   SUBSTRING ( @strSortColumn 0 CHARINDEX ( ' . ' , @strSortColumn ))
            
SET   @SortName   =   SUBSTRING ( @strSortColumn CHARINDEX ( ' . ' , @strSortColumn +   1 LEN ( @strSortColumn ))
        
END
    
ELSE
        
BEGIN
            
SET   @SortTable   =   @Table
            
SET   @SortName   =   @strSortColumn
        
END

    
SELECT   @Type = t.name,  @Prec = c.prec
    
FROM  sysobjects o 
    
JOIN  syscolumns c  on  o.id = c.id
    
JOIN  systypes t  on  c.xusertype = t.xusertype
    
WHERE  o.name  =   @SortTable   AND  c.name  =   @SortName
    
    
IF   CHARINDEX ( ' char ' @Type >   0
    
SET   @Type   =   @Type   +   ' ( '   +   CAST ( @Prec   AS   nvarchar +   ' ) '

    
DECLARE   @strStartRow   nvarchar ( 50 )
    
DECLARE   @strPageSize   nvarchar ( 50 )
    
DECLARE   @strWhere   nvarchar ( 1000 )
    
DECLARE   @strWhereAnd   nvarchar ( 1000 )
    
DECLARE   @strGroupBy   nvarchar ( 1000 )

    
IF    @PageNumber   <   1
    
SET   @PageNumber   =   1
    
    
SET   @strPageSize   =   CONVERT  ( nvarchar ( 50 ),  @PageSize )
    
SET   @strStartRow   =   CONVERT  (  nvarchar ( 50 ), ( @PageNumber   -   1 ) * @PageSize   +   1 )
    
    
IF   @Where   IS   NOT   NULL   AND   @Where   != ''
    
BEGIN
        
SET   @strWhere   =   '  WHERE  ' +   @Where  
        
SET   @strWhereAnd =   '  AND  '   +   @Where  
    
END
    
ELSE
    
BEGIN
        
SET   @strWhere   =    ''
        
SET   @strWhereAnd = ''
    
END
    
    
IF   @GroupBy   IS   NOT   NULL   AND   @GroupBy   !=   ''
    
BEGIN
        
SET   @strGroupBy   =   '  GROUP BY  '   +   @GroupBy
    
END
    
ELSE
    
BEGIN
        
SET   @strGroupBy   =   ''
    
END

    
DECLARE   @strSQL   nvarchar ( 4000 )
    
SET   @strSql =   '  SELECT  @RecordCount = Count (*)  FROM  '   +   @Table   +   @strWhere   +   '   '    +   @strGroupBy
    
EXEC    sp_executesql    @strSql ,N ' @RecordCount   int   OUTPUT ' , @RecordCount    OUTPUT -- 计算总页数   

    
EXEC
        ( 
        
'
        DECLARE @Sort 
'   +   @Type   +   '
        SET ROWCOUNT 
'   +   @strStartRow   +   '
        SELECT  @Sort = 
'   +   @strSortColumn   +   '   FROM  '   +   @Table   +   @strWhere   +   '   '    +   @strGroupBy   +   '  ORDER BY  '   +   @OrderBy   +   '  
        SET ROWCOUNT 
'   +   @strPageSize   +   '  
        SELECT 
' + @Field + '   FROM  '   +   @Table   +   '  WHERE  '   +   @strSortColumn    +   @Operator    +   '  @Sort  '   +   @strWhereAnd   +   '   '    +   @strGroupBy   +   '  ORDER BY  '   +    @OrderBy
        )
GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO

 支持任意字段排序的存储过程

if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[sys_SortDataPager] ' and   OBJECTPROPERTY (id, N ' IsProcedure ' =   1 )
drop   procedure   [ dbo ] . [ sys_SortDataPager ]
GO

SET  QUOTED_IDENTIFIER  ON  
GO
SET  ANSI_NULLS  ON  
GO

CREATE   PROCEDURE  sys_SortDataPager (
    
@Table   nvarchar ( 4000 ),             -- 表名(必须)
     @PrimaryKeyField   nvarchar ( 50 ),         -- 表的主键字段
     @Field   nvarchar  ( 4000 ) = ' * ' ,          -- 需要返回字段名(必须)
     @Where   nvarchar ( 1000 ) = NULL ,         -- Where 条件(可选)
     @GroupBy   nvarchar ( 1000 =   NULL ,      -- 分组
     @OrderBy   nvarchar ( 1000 ) = NULL ,      -- 排序用到的字段()
     @PageNumber   int   =   1 ,              -- 要返回的页(第X页) (默认为第一页)
     @PageSize   int   =   10 ,             -- 每页大小(默认为5)
     @RecordCount   int  out             -- 返回记录总数
)
AS

    
/**/ /*Find the @PrimaryKeyField type*/
    
DECLARE   @PKTable   varchar ( 1000 )
    
DECLARE   @PKName   varchar ( 1000 )
    
DECLARE   @type   varchar ( 1000 )
    
DECLARE   @prec   int
    
    
IF   CHARINDEX ( ' . ' @PrimaryKeyField >   0
        
BEGIN
            
SET   @PKTable   =   SUBSTRING ( @PrimaryKeyField 0 CHARINDEX ( ' . ' , @PrimaryKeyField ))
            
SET   @PKName   =   SUBSTRING ( @PrimaryKeyField CHARINDEX ( ' . ' , @PrimaryKeyField +   1 LEN ( @PrimaryKeyField ))
        
END
    
ELSE
        
BEGIN
            
SET   @PKTable   =   @Table
            
SET   @PKName   =   @PrimaryKeyField
        
END
    
    
SELECT   @type = t.name,  @prec = c.prec  FROM  sysobjects o  JOIN  syscolumns c  on  o.id = c.id     JOIN  systypes t  on  c.xusertype = t.xusertype
    
WHERE  o.name  =   @PKTable   AND  c.name  =   @PKName
    
    
IF   CHARINDEX ( ' char ' @type >   0
    
SET   @type   =   @type   +   ' ( '   +   CAST ( @prec   AS   varchar +   ' ) '
    
    
DECLARE   @strPageSize   varchar ( 50 )
    
DECLARE   @strStartRow   varchar ( 50 )
    
DECLARE   @strWhere   varchar ( 1000 )
    
DECLARE   @strGroupBy   varchar ( 1000 )
    
    
/**/ /*Default Sorting*/
    
IF   @OrderBy   IS   NULL   OR   @OrderBy   =   ''
    
SET   @OrderBy   =   @PrimaryKeyField
    
    
/**/ /*Default Page Number*/
    
IF   @PageNumber   <   1
    
SET   @PageNumber   =   1
    
    
/**/ /*Set paging variables.*/
    
SET   @strPageSize   =   CAST ( @PageSize   AS   varchar ( 50 ))
    
SET   @strStartRow   =   CAST ((( @PageNumber   -   1 ) * @PageSize   +   1 AS   varchar ( 50 ))
    
    
/**/ /*Set filter & group variables.*/
    
IF   @Where   IS   NOT   NULL   AND   @Where   !=   ''
        
SET   @strWhere   =   '  WHERE  '   +   @Where   +   '   '
    
ELSE
        
SET   @strWhere   =   ''
    
IF   @GroupBy   IS   NOT   NULL   AND   @GroupBy   !=   ''
        
SET   @strGroupBy   =   '  GROUP BY  '   +   @GroupBy   +   '   '
    
ELSE
        
SET   @strGroupBy   =   ''
        
    
/**/ /*Execute dynamic query*/     
        
DECLARE   @strSQL   nvarchar ( 4000 )
    
SET   @strSql =   '  SELECT  @RecordCount = Count (*)  FROM  '   +   @Table   +   @strWhere   +   '   '    +   @strGroupBy
    
EXEC    sp_executesql    @strSql ,N ' @RecordCount   int   OUTPUT ' , @RecordCount    OUTPUT -- 计算总页数

    
EXEC (
    
' DECLARE @PageSize int
    SET @PageSize = 
'   +   @strPageSize   +   '
    
    DECLARE @PrimaryKeyField 
'   +   @type   +   '
    DECLARE @tblPK TABLE (
                PK  
'   +   @type   +   '  NOT NULL PRIMARY KEY
                )
    
    DECLARE PagingCursor CURSOR DYNAMIC READ_ONLY FOR
    SELECT 
'    +   @PrimaryKeyField   +   '  FROM  '   +   @Table   +   @strWhere   +   '   '   +   @strGroupBy   +   '  ORDER BY  '   +   @OrderBy   +   '
    
    OPEN PagingCursor
    FETCH RELATIVE 
'   +   @strStartRow   +   '  FROM PagingCursor INTO @PrimaryKeyField
    
    SET NOCOUNT ON
    
    WHILE @PageSize > 0 AND @@FETCH_STATUS = 0
    BEGIN
                INSERT @tblPK (PK)  VALUES (@PrimaryKeyField)
                FETCH NEXT FROM PagingCursor INTO @PrimaryKeyField
                SET @PageSize = @PageSize - 1
    END
    
    CLOSE       PagingCursor
    DEALLOCATE  PagingCursor
    
    SELECT 
'   +   @Field   +   '  FROM  '   +   @Table   +   '  JOIN @tblPK tblPK ON  '   +   @PrimaryKeyField   +   '  = tblPK.PK  '   +   @strWhere   +   '   '   +   @strGroupBy   +   '  ORDER BY  '   +   @OrderBy
    )
GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO

创建一个用于测试的表

CREATE   TABLE   [ dbo ] . [ Employees ]  (
    
[ EmployeesID ]   [ numeric ] ( 18 0 IDENTITY  ( 1 1 NOT   NULL  ,
    
[ LastName ]   [ nvarchar ]  ( 50 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
    
[ FirstName ]   [ nvarchar ]  ( 50 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
    
[ BirthDate ]   [ datetime ]   NULL  ,
    
[ Address ]   [ nvarchar ]  ( 60 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
    
[ City ]   [ nvarchar ]  ( 18 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
    
[ HomePhone ]   [ nvarchar ]  ( 24 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
    
[ Extension ]   [ nvarchar ]  ( 4 ) COLLATE Chinese_PRC_CI_AS  NULL  
ON   [ PRIMARY ]
GO

生成 1000000 条测试数据

if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[InsertTableData] ' and   OBJECTPROPERTY (id, N ' IsProcedure ' =   1 )
drop   procedure   [ dbo ] . [ InsertTableData ]
GO

SET  QUOTED_IDENTIFIER  ON  
GO
SET  ANSI_NULLS  OFF  
GO

CREATE   PROCEDURE  InsertTableData 
AS
DECLARE   @cnt   bigint
SET   @cnt   =   0
WHILE   @cnt   <   1000000
    
BEGIN
        
INSERT   INTO  Employees(LastName,FirstName,BirthDate,Address,City,HomePhone,Extension) 
        
Values
        (
        
CAST ( ' LastName  '   + CONVERT ( nvarchar ( 10 ),  @cnt as   nvarchar ( 30 )),
        
CAST ( ' FirstName  ' +    CONVERT ( nvarchar ( 10 ),  @cnt as   nvarchar ( 30 )),
        
GETDATE (),
        
CAST ( ' Address IS No. ' +   CONVERT ( nvarchar ( 10 ),  @cnt as   nvarchar ( 30 )),
        
CAST ( ' City   ' +   CONVERT ( nvarchar ( 10 ),  @cnt as   nvarchar ( 30 )),        
        
CAST ( ' 021-0000 ' +   LEFT ( CONVERT ( nvarchar ( 10 ),  @cnt ), 4 as   nvarchar ( 30 )),
        
CAST ( ' 00 '   +    LEFT ( CONVERT ( nvarchar ( 10 ),  @cnt ) , 1 as   nvarchar ( 30 ))
        )
        
SET   @cnt   =   @cnt   +   1
    
END
GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值