再来一个分页的存储过程,这可比别的好多了,就是不知速度如何!
发表于:2007-06-30来源:作者:点击数:
标签:
存储过程: ALTER PROCEDURE spPagination @FieldList Nvarchar(200),--字段列表 @TableName Nvarchar(20), --表名 @WhereStr Nvarchar(500),--条件语句(须写完整,如where Name=@#sea@# and image=0,如果使用OR语句,须用():如:Where (Name=@#sea@# OR image=0)
存储过程:
ALTER PROCEDURE spPagination
@FieldList Nvarchar(200),--字段列表
@TableName Nvarchar(20), --表名
@WhereStr Nvarchar(500),--条件语句(须写完整,如"where Name=@#sea@# and image=0",如果使用OR语句,须用():如:"Where (Name=@#sea@# OR image=0)"
@PrimaryKey Nvarchar(20),--主键
@SortStr Nvarchar(100),--排序语句(须写完整,如"Order By ID,Nname")
@SortStrDesc Nvarchar(100), --倒序语句(须写完整,如"Order By ID desc,Nname desc")
@PageSize int,--页记录数
@PageNo int,--页码
@RecordCount int OUTPUT,--返回记录总数
@PageCount int OUTPUT--返回页总数
AS
/*定义局部变量*/
declare @intBeginID nvarchar(20)
declare @intEndID nvarchar(20)
declare @intRecordCount int
declare @intRowCount int
declare @TmpSelect NVarchar(600)
/*关闭计数*/
set nocount on
/*
set @PageNo=7
set @PageSize=2
set @SortStr=@#order by subproclassid, ProductID@#
set @SortStrDesc=@#order by subproclassid desc, ProductID desc@#
*/
/*求总记录数*/
Set @TmpSelect = @#set nocount on;select @SPintRootRecordCount = count(*) from @#+@TableName+@# @#+@WhereStr
execute sp_execute
sql
@TmpSelect,
N@#@SPintRootRecordCount int OUTPUT@#,
@SPintRootRecordCount=@intRecordCount OUTPUT
/*返回总记录数*/
set @RecordCount = @intRecordCount
if @intRecordCount=0
--没有记录则返回一个空记录集
Begin
Set @TmpSelect=@#Select @# + @FieldList + @# from @#+@TableName+@# @#+@WhereStr
Execute sp_executesql @TmpSelect
set @RecordCount=0
set @PageCount=1
End
else
--有记录则返回记录集
begin
/*返回总页数*/
if @intRecordCount <> 0
begin
set @PageCount=floor((@intRecordCount+1.0-1.0) / @PageSize)
if @PageCount<(@intRecordCount+1.0-1.0) / @PageSize
set @PageCount=@PageCount+1
end
else
set @PageCount=0
/*判断页码是否正确
如果页码小于1,设置页码为1,如果页码大于总页数,设置页码为总页数*/
if @PageNo<1
set @PageNo=1
else
if @PageNo>@PageCount
set @PageNo=@PageCount
/*求结束记录位置*/
set @intRowCount = @PageNo * @PageSize
/*如果是最后页则返回余下的记录*/
if @PageNo=@PageCount
set @PageSize=@RecordCount - (@PageNo-1) * @PageSize
/* 开始分页 */
set @TmpSelect= @#select * from @# + @TableName + @# where @# + @PrimaryKey + @# = any (@#
set @TmpSelect=@TmpSelect + @#select top @# + str(@PageSize) + @# @# + @PrimaryKey + @# from @# + @TableName + @# where @# + @PrimaryKey + @# in (select top @# + str(@intRowCount) + @# @# + @PrimaryKey + @# from @# + @TableName
set @TmpSelect=@TmpSelect + @# @# + @WhereStr + @# @# + @SortStr + @#) @# + @SortStrDesc
set @TmpSelect=@TmpSelect + @#) @# + @SortStr
execute sp_executesql @TmpSelect
end
/*返回受上一行影响的行数*/
return @@rowcount
VB类:
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.Configuration
Namespace Gyone.DataA
clearcase/" target="_blank" >ccess
Public Class Pagination
Private connStr As String = ConfigurationSettings.AppSettings("connStr")
Private dsCommand As New SqlDataAdapter()
@#------------------------------------------------------------------------------------------------
Private _FieldList As String = "*"
Private _TableName As String
Private _WhereStr As String = ""
Private _PrimaryKey As String
Private _SortStr As String = ""
Private _SortStrDesc As String
Private _PageSize As Integer = 15
Private _PageNo As Integer = 1
Private _RecordCount As Integer
Private _PageCount As Integer
@#-------------------------------------------------------------------------------------------------
@#定义字段列表属性
Public Property FieldList() As String
Get
Return _FieldList
End Get
Set(ByVal Value As String)
_FieldList = Value
End Set
End Property
@#-------------------------------------------------------------------------------------------------------
@#定义表名属性
Public Property TableName() As String
Get
Return _TableName
End Get
Set(ByVal Value As String)
_TableName = Value
End Set
End Property
@#-------------------------------------------------------------------------------------------------------
@#定义条件语句属性,须写完整,如"Where Id=5 And Name=@#sea@#",如使用了"Or"语句,则须用()括住如:"Where (Id=5 Or Name=@#sea@#)"
Public Property WhereStr() As String
Get
Return _WhereStr
End Get
Set(ByVal Value As String)
_WhereStr = "Where " & Value
End Set
End Property
@#----------------------------------------------------------------------------------------------------
@#定义主键
Public Property PrimaryKey() As String
Get
Return _PrimaryKey
End Get
Set(ByVal Value As String)
_PrimaryKey = Value
End Set
End Property
@#--------------------------------------------------------------------------------------------------------
@#定义排序语句属性,须写完整,如"Order By Id Desc,Name"
Public Property SortStr() As String
Get
Return _SortStr
End Get
Set(ByVal Value As String)
_SortStr = "Order By " & Value
Dim s() As String = Value.Split(",")
Dim i As String
_SortStrDesc = Nothing
For Each i In s
If _SortStrDesc = Nothing Then
If InStr(i.ToUpper, "DESC") > 0 Then
_SortStrDesc = "Order By " & i.ToUpper.Replace("DESC", "")
Else
_SortStrDesc = "Order By " & i & " DESC"
End If
Else
If InStr(i, "desc") > 0 Then
_SortStrDesc += "," & i.ToUpper.Replace("DESC", "")
Else
_SortStrDesc += "," & i & " DESC"
End If
End If
Next
End Set
End Property
@#-------------------------------------------------------------------------------------------------------
@#定义页记录数属性
Public Property PageSize() As Integer
Get
Return _PageSize
End Get
Set(ByVal Value As Integer)
_PageSize = Value
End Set
End Property
@#--------------------------------------------------------------------------------------------------------
@#定义页码属性
Public Property PageNo() As Integer
Get
Return _PageNo
End Get
Set(ByVal Value As Integer)
_PageNo = Value
End Set
End Property
@#-----------------------------------------------------------------------------------------------------------
@#定义总记录数属性(只读)
Public ReadOnly Property RecordCount() As Integer
Get
Return _RecordCount
End Get
End Property
@#---------------------------------------------------------------------------------------------------------
@#定义页总数属性(只读)
Public ReadOnly Property PageCount() As Integer
Get
Return _PageCount
End Get
End Property
@#----------------------------------------------------------------------------------------------------------
@#定义分页方法
Public Function Pagination() As DataSet
Dim Data As New DataSet(TableName)
Dim objCmd As New SqlCommand("spPagination", New SqlConnection(connStr))
objCmd.CommandType = CommandType.StoredProcedure
With objCmd.Parameters
.Add(New SqlParameter("@FieldList", SqlDbType.NVarChar, 200))
.Add(New SqlParameter("@TableName", SqlDbType.NVarChar, 20))
.Add(New SqlParameter("@WhereStr", SqlDbType.NVarChar, 500))
.Add(New SqlParameter("@PrimaryKey", SqlDbType.NVarChar, 20))
.Add(New SqlParameter("@SortStr", SqlDbType.NVarChar, 100))
.Add(New SqlParameter("@SortStrDesc", SqlDbType.NVarChar, 100))
.Add(New SqlParameter("@PageSize", SqlDbType.Int))
.Add(New SqlParameter("@PageNo", SqlDbType.Int))
.Add(New SqlParameter("@RecordCount", SqlDbType.Int))
.Add(New SqlParameter("@PageCount", SqlDbType.Int))
.Item("@FieldList").Value = _FieldList
.Item("@TableName").Value = _TableName
.Item("@WhereStr").Value = _WhereStr
.Item("@PrimaryKey").Value = _PrimaryKey
.Item("@SortStr").Value = _SortStr
.Item("@SortStrDesc").Value = _SortStrDesc
.Item("@PageSize").Value = _PageSize
.Item("@PageNo").Value = _PageNo
.Item("@RecordCount").Direction = ParameterDirection.Output
.Item("@PageCount").Direction = ParameterDirection.Output
End With
dsCommand.SelectCommand = objCmd
dsCommand.Fill(Data, TableName)
_RecordCount = dsCommand.SelectCommand.Parameters("@RecordCount").Value
_PageCount = dsCommand.SelectCommand.Parameters("@PageCount").Value
Return Data
End Function
End Class
End Namespace
原文转自:http://www.ltesting.net