Delphi调用SQL分页存储过程实例

来源:互联网 发布:sql 修改 primary key 编辑:程序博客网 时间:2024/05/14 19:07

//-----下面是一个支持任意表的 SQL SERVER2000分页存储过程

//----分页存储过程开始创建-----------------------------------------------------------------------------------------------------------
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'PageShowOne' AND type = 'P')
   DROP PROCEDURE PageShowOne
GO

CREATE Proc PageShowOne
    @PageSize int=10 ,--每页显示的记录数
    @PageCurrent int=1 ,--当前要显示的页号
    @FdName varchar(100)='' ,--主键名或者标识列名
    @SelectStr varchar(2000)='', --select子句,不包含select关键字,如:*或者Id,UserId,UserName等。
    @FromStr varchar(1000)='', --from子句,不包含from关键子,如:myTable或者myTable,yourTable
    @WhereStr varchar(2000)='', --Where子句,不包含where关键字,如空的,或者 id>2 等
    @OrderByStr varchar(1000)='',--order by 子句,不包含order by 子句 ,如id desc,UserId asc 等
    @CountRows int=0 output, --返回记录总数
    @CountPage int=0 output --返回总页数
as
--------定义局部变量---------
declare @Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
declare @OrderBySqls varchar(1000) --order by 子句
declare @WhereSqls varchar(2000) --where 子句
declare @Sqls nvarchar(4000) --最终组合成的Sqls语句
declare @TmpStr varchar(2000) --临时
----------------------------
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<=1 
begin
    select @Id1=cast(@PageSize as varchar(20))
    exec('select top '+@Id1+' '+@SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls)
    goto LabelRes
end
---------------------------
select @Id1=cast(@PageSize as varchar(20))
       ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))
----------
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 = 1
else
begin
    set @CountPage = @CountRows/@PageSize
    if (@CountRows%@PageSize) > 0
       set @CountPage = @CountPage + 1
end
return
GO
//----分页存储过程结束---------------------------------------------------------------------------------------

//----Delphi7调用过程开始----------------------------------------------------------------------------------------

首先在 public 中定义 i, RsCount: integer;
在frmMain中放置一个dbgrid , datasource, AdoStoredProc [name->sp], 和4个 Button, 设置好相关连接!

procedure TfrmMain.btnFirstClick(Sender: TObject);
begin
  i := 1;
  sp.ProcedureName := 'PageShowOne;1'; 

  sp.Close;
  sp.Parameters; // 

  sp.Parameters.ParamByName('@PageSize').Value := 50;
  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'];  //这里的返回值如果用的是UNI的组件要把@符号去掉
  Label3.Caption := '第 '+IntToStr(i)+ ' 页';
end;

procedure TfrmMain.btnNextClick(Sender: TObject);
begin
  if i >= RsCount then
    ShowMessage('已经是最后一页!')
  else
    i := i + 1;
  sp.ProcedureName := 'PageShowOne;1';
  sp.Close;
  sp.Parameters.ParamByName('@PageSize').Value := 50;
  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 > 1 then
    i := i - 1
  else ShowMessage('已经是第一页了!');
  sp.ProcedureName := 'PageShowOne;1';
  sp.Close;
  sp.Parameters.ParamByName('@PageSize').Value := 50;
  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 := 50;
  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;
//--------------调用结束--------------------------------------------------------------------------------------------------------------------

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 联想笔记本r720系统崩溃怎么办 联想天逸310卡怎么办 新买的鼠标没反应怎么办 联想笔记本触屏鼠标失灵怎么办 无线鼠标接收器丢了怎么办 联想笔记本系统重装失败怎么办 联想笔记本屏幕闪屏怎么办 种植牙螺钉掉了怎么办 水管牙断里面了怎么办 水龙头起泡器不起泡怎么办 14mm乘8mm残留怎么办 宝宝吃了螺丝冒怎么办 收割机滚筒皮带轮键槽滚了怎么办 微信界面变小了怎么办 拉杆箱螺丝掉了怎么办 洗衣机应急门锁没有拉绳怎么办? 奔驰glc发动机声音大怎么办 淋膜机模具螺丝拧不动怎么办 一字螺丝滑丝了怎么办 螺丝拧歪卡住了怎么办 车牌螺丝拧歪了怎么办 空心墙打膨胀螺丝打不上怎么办 沉孔内六角螺丝滑丝怎么办 内六角螺丝滑了怎么办? 三色灯不变光了怎么办 卧室灯不变色了怎么办 圆柱齿轮减速机噪音大怎么办 轴与套间隙生锈怎么办 汽车停小区被刮怎么办 下楼梯摔跤了 屁股疼 怎么办 剧烈咳嗽震的肚子疼怎么办 饺子粘在盘子上怎么办 生饺子粘在盘子怎么办 饺子粘在案板上怎么办 饺子冷冻粘起了怎么办 冰箱饺子冻住了怎么办 水饺都冻一块了怎么办 wps卸载了后文件打不开怎么办 六角螺母拧滑了怎么办 梅花内六角螺丝扭滑丝了怎么办 眼镜螺丝滑丝了怎么办