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


本文整理自网络,侵删。

 
下面是一个支持任意表的 SQL SERVER2000分页存储过程
下面是一个支持任意表的 SQL SERVER2000分页存储过程 
 //-----下面是一个支持任意表的 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调用过程开始 
//----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.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'];
  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;
//--------------调用结束-------------------------------------------------------------------------------------------------------------------


来源:https://www.cnblogs.com/jieke/archive/2012/12/22/2829284.html

相关阅读 >>

Delphi android下拉刷新

Delphi thread.queue与synchronize的区别

Delphi format格式化函数

Delphi 运行clsid文件

Delphi 一个文件重复生成的小工具[附源码]

Delphi 窗体置顶(总在最前面)

Delphi中模拟鼠标点击事件

Delphi制作外挂的操作技巧

Delphi xe5调用外部扫描程序――谷歌 zxing

Delphi webbrowser1 execwb 复制 新建 打开

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...