请问各位大侠,我在delphi在访问sql server数据库,用TDBgrid控件显示查询结果。结果数据集比较大,因此想要分页显示,使每页显示50条记录,该如何实现?
解决方案 »
- delphi2010源代码如何移植到delphi7下?
- !!!!!!!!!!!!!为什么我没办法使用copyfile函数呀!!!!!!!!!!!!!!
- 如何用CreateProcess得到进程ID和窗口句柄???!
- 請教一個隨機號碼的函數
- delphi如何往数据库插入数据。
- 请教fastreport,quickreport,rave,Crystal的区别
- 求助大虾,为了让我也能安心地吃块月饼!!!
- 怎样才能打印整个panle出来?
- 送分了!怎么获得本机ip?
- 高手关注:两表间数据更新的问题
- 请问indy的TCPServer如何知道连接的client的IP?如何知道断开的client的IP?
- hSession := InternetOpen('MyApp', 。。。。。。。),怎样取得webbrowser的hSession?
方法简单且效率高,已知的问题就是要多返回一个空的记录集 解决的方法是在前台调用时,用 set recordset=recordset.nextrecordset
的方法跳过第一个记录集
此方法由J9988提供,我只是将它改成了方便调用的存储过程--邹建 2004.05--*/
CREATE procedure p_splitpage
@sql nvarchar(4000), --要执行的sql语句
@currentpage int=2, --要显示的页码
@pagesize int=10, --每页的大小
@pagecount int=0 out --总页数
as
set nocount on
declare @p1 intexec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount outputselect @pagecount=ceiling(1.0*@pagecount/@pagesize)
,@currentpage=(@currentpage-1)*@pagesize+1
select @currentpage
exec sp_cursorfetch @p1,16,@currentpage,@pagesize
exec sp_cursorclose @p1
GO
ADOQuery1.SQL.Clear;
pageCount := (page-1) * 100;
///// 分页查询语句
ADOQuery1.SQL.Add(format('select top 100 * from Alarm_Command_Log where log_serial_number not in (select top %d log_serial_number from Alarm_Command_Log order by log_serial_number) order by log_serial_number',[pageCount]));
page := page + 1;
adoquery1.Active := true; count := count + 1;
end;
ClientDataSet1.fetchondemand:=false;
ClientDataSet1.getnextpacket;
所以,我用SQL +TClientDataSet作成分叶:客户端:
var
i:Integer;
t_sql,str1,strend:wideString;
quedata:olevariant;
//2004-2-10为了优化程序性能 速度已提高到52秒
lStart, lEnd : Integer;
begin
//inherited;
// lStart := GetTickCount;
if not dmmain.DSquery.Active then exit; screen.Cursor := crhourglass;
//关掉与DBGRID 的互动
dmmain.dsquery.DisableControls;
t_sql:='select top ' + trim(ComboBox1.Text) +' * from TableName '+sWhere;
t_sql := t_sql+ ' and id > '+ inttostr(localcount);
try
ipubtemp.ty_query(t_sql,quedata);
if not varisnull(quedata) then
begin
if dmmain.dsquery.Active then dmmain.dsquery.Close;
dmmain.dsquery.Open;
dmmain.dsquery.AppendData(quedata,true);
dmmain.dsquery.Last;
dmmain.dsquery.EnableControls;
//得到此次查询的键值
LocalCount := GetKeyFieldValue('id'); //传入具体字段
edtRecNo.Text := '当前共有'+inttostr(dmmain.dsquery.recordcount) +'条';
end else
begin
//不再有数据
dmmain.dsquery.EnableControls; //ydy 必须要
btnpagedown.Enabled := false;
screen.Cursor := crdefault;
exit;
end;
except
dmmain.dsquery.EnableControls;
dbgrid1.Refresh;
end;
dmmain.dsquery.EnableControls;
dbgrid1.Refresh;
screen.Cursor := crdefault;
---------------------------
见笑了!!!