Delphi调用SQL分页存储过程实例 (-- ::)转载▼
标签: it 分类: Delphi相关
//-----下面是一个支持任意表的 SQL SERVER2000分页存储过程 //----分页存储过程开始创建----------------------------------------------------------------------------------------------------------- IF EXISTS (SELECT name FROM sysobjects WHERE name = 'PageShowOne' AND type = 'P') DROP PROCEDURE PageShowOne GO CREATE Proc PageShowOne @PageSize int= ,--每页显示的记录数 @PageCurrent int= ,--当前要显示的页号 @FdName varchar()='' ,--主键名或者标识列名 @SelectStr varchar()='', --select子句,不包含select关键字,如:*或者Id,UserId,UserName等。 @FromStr varchar()='', --from子句,不包含from关键子,如:myTable或者myTable,yourTable @WhereStr varchar()='', --Where子句,不包含where关键字,如空的,或者 id> 等 @OrderByStr varchar()='',--order by 子句,不包含order by 子句 ,如id desc,UserId asc 等 @CountRows int= output, --返回记录总数 @CountPage int= output --返回总页数 as --------定义局部变量--------- declare @Id1 varchar(),@Id2 varchar() --开始和结束的记录号 declare @OrderBySqls varchar() --order by 子句 declare @WhereSqls varchar() --where 子句 declare @Sqls nvarchar() --最终组合成的Sqls语句 declare @TmpStr varchar() --临时 ---------------------------- if @OrderByStr <> '' set @OrderBySqls = ' order by '+@OrderByStr else set @OrderBySqls = '' -------- if @WhereStr <> '' set @WhereSqls = ' where ('+@WhereStr+')' else set @WhereSqls = '' -------- set @TmpStr = @WhereSqls --如果显示第一页,可以直接用top来完成 if @PageCurrent<= begin select @Id1=cast(@PageSize as varchar()) exec('select top '+@Id1+' '+@SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls) goto LabelRes end --------------------------- select @Id1=cast(@PageSize as varchar()) ,@Id2=cast((@PageCurrent-)*@PageSize as varchar()) ---------- if @WhereSqls <> '' set @WhereSqls = @WhereSqls + ' and (' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+'))' else set @WhereSqls = ' where ' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+')' ---------- set @Sqls = 'select top '+@Id1+ ' '+ @SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls exec (@Sqls) ----------- LabelRes: -----返回总记录数 set @Sqls = 'select @a=count(1) from '+@FromStr+@TmpStr exec sp_executesql @sqls,N'@a int output',@CountRows output -----返回总页数 if @CountRows <= @PageSize set @CountPage = else begin set @CountPage = @CountRows/@PageSize if (@CountRows%@PageSize) > set @CountPage = @CountPage + end return GO //----分页存储过程结束--------------------------------------------------------------------------------------- //----Delphi7调用过程开始---------------------------------------------------------------------------------------- 首先在 public 中定义 i, RsCount: integer; 在frmMain中放置一个dbgrid , datasource, AdoStoredProc [name->sp], 和4个 Button, 设置好相关连接! procedure TfrmMain.btnFirstClick(Sender: TObject); begin i := ; sp.ProcedureName := 'PageShowOne;1'; sp.Close; sp.Parameters.ParamByName('@PageSize').Value := ; sp.Parameters.ParamByName('@PageCurrent').Value := i; sp.Parameters.ParamByName('@FdName').Value := '图纸编号'; sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数'; sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi'; sp.Parameters.ParamByName('@WhereStr').Value := ''; sp.Parameters.ParamByName('@OrderByStr').Value := '日期'; sp.Open; Label1.Caption := '记录总数:'+IntToStr(sp.Parameters.ParamValues['@CountRows']); Label2.Caption := '总页数:'+IntToStr(sp.Parameters.ParamValues['@CountPage']); RsCount := sp.Parameters.ParamValues['@CountPage']; Label3.Caption := '第 '+IntToStr(i)+ ' 页'; end; procedure TfrmMain.btnNextClick(Sender: TObject); begin if i >= RsCount then ShowMessage('已经是最后一页!') else i := i + ; sp.ProcedureName := 'PageShowOne;1'; sp.Close; sp.Parameters.ParamByName('@PageSize').Value := ; sp.Parameters.ParamByName('@PageCurrent').Value := i; sp.Parameters.ParamByName('@FdName').Value := '图纸编号'; sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数'; sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi'; sp.Parameters.ParamByName('@WhereStr').Value := ''; sp.Parameters.ParamByName('@OrderByStr').Value := '日期'; sp.Open; Label3.Caption := '第 '+IntToStr(i)+ ' 页'; end; procedure TfrmMain.btnPriorClick(Sender: TObject); begin if i > then i := i - else ShowMessage('已经是第一页了!'); sp.ProcedureName := 'PageShowOne;1'; sp.Close; sp.Parameters.ParamByName('@PageSize').Value := ; sp.Parameters.ParamByName('@PageCurrent').Value := i; sp.Parameters.ParamByName('@FdName').Value := '图纸编号'; sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数'; sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi'; sp.Parameters.ParamByName('@WhereStr').Value := ''; sp.Parameters.ParamByName('@OrderByStr').Value := '日期'; sp.Open; Label3.Caption := '第 '+IntToStr(i)+ ' 页'; end; procedure TfrmMain.btnLastClick(Sender: TObject); begin i := RsCount; sp.ProcedureName := 'PageShowOne;1'; sp.Close; sp.Parameters.ParamByName('@PageSize').Value := ; sp.Parameters.ParamByName('@PageCurrent').Value := i; sp.Parameters.ParamByName('@FdName').Value := '图纸编号'; sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数'; sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi'; sp.Parameters.ParamByName('@WhereStr').Value := ''; sp.Parameters.ParamByName('@OrderByStr').Value := '日期'; sp.Open; Label3.Caption := '第 '+IntToStr(i)+ ' 页'; end; //--------------调用结束-------------------------------------------------------------------------------------------------------------------