zoukankan      html  css  js  c++  java
  • 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;

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

  • 相关阅读:
    linux常用命令
    mysql 开发基础系列20 事务控制和锁定语句(上)
    sql server 性能调优之 资源等待 CXPACKET
    mysql 开发基础系列19 触发器
    mysql 开发基础系列18 存储过程和函数(下)
    mysql 开发基础系列17 存储过程和函数(上)
    sql server 性能调优之 资源等待PAGEIOLATCH
    mysql 开发基础系列16 视图
    mysql 开发基础系列15 索引的设计和使用
    sql server 性能调优之 当前用户请求分析 (1)
  • 原文地址:https://www.cnblogs.com/94YY/p/2043500.html
Copyright © 2011-2022 走看看