• 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 //--------------调用结束-------------------------------------------------------------------------------------------------------------------
  • 相关阅读:
    经典笑话集1
    什么是无知——郎咸平
    施工导截流方案辅助设计软件的总体功能(首次公开)
    流行水利水电工程施工导截流软件的架构存在的问题
    GoogleEarth二次开发(资料二)
    水利水电工程施工导截流设计现状
    软件开发定律21条[转]
    GoogleEarth二次开发(资料一)
    我们的软件即将要交付成果了!
    javascript 常用小例子收集
  • 原文地址:https://www.cnblogs.com/jieke/p/2829284.html
Copyright © 2020-2023  润新知