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

转载 2006年05月27日 16:01:00
作者:kenme  来源于:www.gmplay.com  发布时间:2005-12-16 12:47:00

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

C#调用SQL Server分页存储过程

C#调用SQL Server分页存储过程
  • roy_88
  • roy_88
  • 2016年05月04日 22:26
  • 3626

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

//-----下面是一个支持任意表的 SQL SERVER2000分页存储过程 //----分页存储过程开始创建-------------------------------------------...
  • yeeonefx
  • yeeonefx
  • 2016年12月16日 09:48
  • 423

在asp中调用sql server的存储过程方法

在asp中调用sql server的存储过程可以加快程序运行速度   1.调用存储过程的一般方法   先假设在sql server中有一存储过程dt_users:   CREATE PROCED...
  • sscrazy
  • sscrazy
  • 2014年11月13日 16:01
  • 566

java调用存储过程实现分页功能

创建程序包: SQL> create or replace package mypack 2 as 3 type emp_cursor is ref cursor; 4 end m...
  • xingzhemoluo
  • xingzhemoluo
  • 2014年09月17日 20:10
  • 910

SQLServer千万数量级分页公共存储过程

转自:http://blog.csdn.net/tem168/article/details/6427123 SQLServer千万数量级分页公共存储过程   通用的数据库分页存...
  • chelen_jak
  • chelen_jak
  • 2014年12月11日 21:24
  • 3099

Delphi中如何调用存储过程?

估计有很多朋友用delphi写过与SQL Server 2000数据结合的一些MIS系统,对于大量的数据保存,及数据更新.常常考虑到用存储过程来实现...今天我写了一个简单的例子,希望能给一些朋友一点...
  • delphi308
  • delphi308
  • 2013年12月17日 21:34
  • 2985

三种SQL分页查询的存储过程代码

--根据MAX(MIN)ID CREATE PROC [dbo].[proc_select_id] @pageindex int=1,--当前页数 @pagesize int=10,--每...
  • Denghejing
  • Denghejing
  • 2014年11月10日 16:14
  • 1232

通用分页存储过程的使用

看着同事写的通用分页存储过程觉得还不错,分享给大家 1、存储过程 USE [test] GO /****** Object:  StoredProcedure [dbo]....
  • f10_s
  • f10_s
  • 2013年09月10日 16:35
  • 1341

数据库分页存储过程,支持多表联合查询

数据库分页存储过程,支持多表联合查询 CREATE PROCEDURE [dbo].[getInQuiryAllByPage] @tableNames varchar(5000), --表...
  • gaoxu529
  • gaoxu529
  • 2015年05月21日 16:07
  • 1439

sqlServer分页存储过程的调用

现象: sqlServer的分页一直相对比较复杂。这里使用存储过程实现分页逻辑解决办法 1:action获取查询的条件,初始化每页显示的大小,page代表当前查看第几页,默认设置为第一页。rows...
  • hcwbr123
  • hcwbr123
  • 2017年04月28日 11:39
  • 530
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi调用SQL分页存储过程实例 [转]
举报原因:
原因补充:

(最多只允许输入30个字)