Delphi調用SQL分頁存儲過程實例
阿新 • • 發佈:2019-02-01
char sele des 高度 nbsp dna procedure one 變量
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分頁存儲過程實例