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

下面是一个支持任意表的 SQL SERVER2000分页存储过程
 1 下面是一个支持任意表的 SQL SERVER2000分页存储过程 
 2  //-----下面是一个支持任意表的 SQL SERVER2000分页存储过程
 3  
 4  //----分页存储过程开始创建-----------------------------------------------------------------------------------------------------------
 5  IF EXISTS (SELECT name FROM sysobjects WHERE name = 'PageShowOne' AND type = 'P')
 6     DROP PROCEDURE PageShowOne
 7  GO
 8  
 9  CREATE Proc PageShowOne
10      @PageSize int=10 ,--每页显示的记录数
11      @PageCurrent int=1 ,--当前要显示的页号
12      @FdName varchar(100)='' ,--主键名或者标识列名
13      @SelectStr varchar(2000)='', --select子句,不包含select关键字,如:*或者Id,UserId,UserName等。
14      @FromStr varchar(1000)='', --from子句,不包含from关键子,如:myTable或者myTable,yourTable
15      @WhereStr varchar(2000)='', --Where子句,不包含where关键字,如空的,或者 id>2 等
16      @OrderByStr varchar(1000)='',--order by 子句,不包含order by 子句 ,如id desc,UserId asc 等
17      @CountRows int=0 output, --返回记录总数
18      @CountPage int=0 output --返回总页数
19  as
20  --------定义局部变量---------
21  declare @Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
22  declare @OrderBySqls varchar(1000) --order by 子句
23  declare @WhereSqls varchar(2000) --where 子句
24  declare @Sqls nvarchar(4000) --最终组合成的Sqls语句
25  declare @TmpStr varchar(2000) --临时
26  ----------------------------
27  if @OrderByStr <> ''
28      set @OrderBySqls = ' order by '+@OrderByStr
29  else
30      set @OrderBySqls = ''
31  --------
32  if @WhereStr <> ''
33      set @WhereSqls = ' where ('+@WhereStr+')'
34  else
35      set @WhereSqls = ''
36  --------
37  set @TmpStr = @WhereSqls
38  --如果显示第一页,可以直接用top来完成
39  if @PageCurrent<=1 
40  begin
41      select @Id1=cast(@PageSize as varchar(20))
42      exec('select top '+@Id1+' '+@SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls)
43      goto LabelRes
44  end
45  ---------------------------
46  select @Id1=cast(@PageSize as varchar(20))
47         ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))
48  ----------
49  if @WhereSqls <> ''
50      set @WhereSqls = @WhereSqls + ' and (' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+'))'
51  else
52      set @WhereSqls = ' where ' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+')'
53  ----------
54  set @Sqls = 'select top '+@Id1+ ' '+ @SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls
55  exec (@Sqls)
56  -----------
57  LabelRes:
58  -----返回总记录数
59  set @Sqls = 'select @a=count(1)  from '+@FromStr+@TmpStr
60  exec sp_executesql @sqls,N'@a int output',@CountRows output 
61  -----返回总页数
62  if @CountRows <= @PageSize
63      set @CountPage = 1
64  else
65  begin
66      set @CountPage = @CountRows/@PageSize
67      if (@CountRows%@PageSize) > 0
68         set @CountPage = @CountPage + 1
69  end
70  return
71  GO
-Delphi7调用过程开始
 1 //----Delphi7调用过程开始----------------------------------------------------------------------------------------
 2 
 3 首先在 public 中定义 i, RsCount: integer;
 4 在frmMain中放置一个dbgrid , datasource, AdoStoredProc [name->sp], 和4个 Button, 设置好相关连接!
 5 
 6 procedure TfrmMain.btnFirstClick(Sender: TObject);
 7 begin
 8   i := 1;
 9   sp.ProcedureName := 'PageShowOne;1';
10   sp.Close;
11   sp.Parameters.ParamByName('@PageSize').Value := 50;
12   sp.Parameters.ParamByName('@PageCurrent').Value := i;
13   sp.Parameters.ParamByName('@FdName').Value := '图纸编号';
14   sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数';
15   sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi';
16   sp.Parameters.ParamByName('@WhereStr').Value := '';
17   sp.Parameters.ParamByName('@OrderByStr').Value := '日期';
18   sp.Open;
19   Label1.Caption := '记录总数:'+IntToStr(sp.Parameters.ParamValues['@CountRows']);
20   Label2.Caption := '总页数:'+IntToStr(sp.Parameters.ParamValues['@CountPage']);
21   RsCount := sp.Parameters.ParamValues['@CountPage'];
22   Label3.Caption := ''+IntToStr(i)+ '';
23 end;
24 
25 procedure TfrmMain.btnNextClick(Sender: TObject);
26 begin
27   if i >= RsCount then
28     ShowMessage('已经是最后一页!')
29   else
30     i := i + 1;
31   sp.ProcedureName := 'PageShowOne;1';
32   sp.Close;
33   sp.Parameters.ParamByName('@PageSize').Value := 50;
34   sp.Parameters.ParamByName('@PageCurrent').Value := i;
35   sp.Parameters.ParamByName('@FdName').Value := '图纸编号';
36   sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数';
37   sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi';
38   sp.Parameters.ParamByName('@WhereStr').Value := '';
39   sp.Parameters.ParamByName('@OrderByStr').Value := '日期';
40   sp.Open;
41   Label3.Caption := ''+IntToStr(i)+ '';
42 end;
43 
44 procedure TfrmMain.btnPriorClick(Sender: TObject);
45 begin
46   if i > 1 then
47     i := i - 1
48   else ShowMessage('已经是第一页了!');
49   sp.ProcedureName := 'PageShowOne;1';
50   sp.Close;
51   sp.Parameters.ParamByName('@PageSize').Value := 50;
52   sp.Parameters.ParamByName('@PageCurrent').Value := i;
53   sp.Parameters.ParamByName('@FdName').Value := '图纸编号';
54   sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数';
55   sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi';
56   sp.Parameters.ParamByName('@WhereStr').Value := '';
57   sp.Parameters.ParamByName('@OrderByStr').Value := '日期';
58   sp.Open;
59   Label3.Caption := ''+IntToStr(i)+ '';
60 end;
61 
62 procedure TfrmMain.btnLastClick(Sender: TObject);
63 begin
64   i := RsCount;
65   sp.ProcedureName := 'PageShowOne;1';
66   sp.Close;
67   sp.Parameters.ParamByName('@PageSize').Value := 50;
68   sp.Parameters.ParamByName('@PageCurrent').Value := i;
69   sp.Parameters.ParamByName('@FdName').Value := '图纸编号';
70   sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数';
71   sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi';
72   sp.Parameters.ParamByName('@WhereStr').Value := '';
73   sp.Parameters.ParamByName('@OrderByStr').Value := '日期';
74   sp.Open;
75   Label3.Caption := ''+IntToStr(i)+ '';
76 end;
77 //--------------调用结束-------------------------------------------------------------------------------------------------------------------
原文地址:https://www.cnblogs.com/jieke/p/2829284.html