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


    //-----下面是一个支持任意表的 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.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;

    //--------------调用结束-------------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    词法分析器实验报告(JAVA)
    词法编辑器(Java)
    编译原理的那些事
    Discuz7.2 faq.php页面注入漏洞分析
    Discuz7.2 XML漏洞
    Python 爬取广州商学院新闻----测试版
    进程调度
    DOS下的网络管理命令
    DOS批处理实验
    熟悉使用DOS操作命令
  • 原文地址:https://www.cnblogs.com/94YY/p/2043500.html
Copyright © 2020-2023  润新知