首页 > 数据库技术 > 详细

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

时间:2019-02-01 20:13:54      阅读:224      评论:0      收藏:0      [点我收藏+]
Delphi调用SQL分页存储过程实例 (2008-11-18 17:12:35)转载▼
标签: it    分类: Delphi相关
//-----下面是一个支持任意表的 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;

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

 

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

原文:https://www.cnblogs.com/westsoft/p/10346854.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!