我在Delphi中用ADO组件打开一个ACCSS表,表名:ResourceTable, 
该表有1000多个记录。 在数据模块中添加了一个TADOConnection用于 ADO链接,
一个TADOQury用于 ADO 的SQL 语句查询。新建一个Form,Form上添加一个TDBGid,
用于显示查询的结果。一般情况下TADOQury上绑定一个TDataSource, 然后TDBGid绑定该TDataSource.如果
TADOQury处于OPen,那么数据表格马上显示了数据记录。 
请问怎样在Delphi中用ADO组件通过sql 查询后在数据表格组件显示记录,
而且实现类似ASP分页?我使用了 ADO的Recordset 对象,把查询后的结果集付给新建的Recordset 对象RS,
可以利用使用 AbsolutePage、PageCount 和 PageSize 属性,对查询结果进行分页操作, 但是分页后结果集怎样显示在数据表格组件中?

解决方案 »

  1.   

    我的思路是在网上一篇文章上找的 _________________________________________________用Delphi开发ASP分页组件 -------------------------------------------------
     
      随着网络技术的发展和Internet的普及,Browser/Server在软件开发中已成为主流,笔者在开发一个ERP系统时,就采用了B/S软件模式,具体架构为SQL Server+IIS+IE网页采用的是Active Server Page文件。由于系统涉及大量的数据操作和查询,若纯粹采用ASP脚本语言编写势必造成效率低下,为了提高系统的整体效率和安全性,笔者采用了ASP组件来代替ASP脚本语言。 
      由于Delphi在开发数据库应用系统中具有的强大的功能和极高的效率,所以笔者开发ASP组件较常用的是Delphi 5.0(当然也可采用Visual Basic或VC++开发ASP组件),Delphi本身在Internet和InternetExpress两个组件面板提供了众多的组件可以直接生成Web页面,但是这些组件都缺少网页中数据显示常见的分页功能。众所周知,ASP是通过建立ADO连接数据库后建立RecordSet对象,然后利用RecordSet的AbsolutePage进行页面定位,而在Delphi 5.0中,已提供了ADO组件封装了Microsoft的ADO库,所以同样具有页面定位功能。下面笔者将分步来开发一个通用的显示分页Web页面的ASP组件。  第一步:新建一个Activex Library,命名为PadoPage,然后再新建一个Active Server Object Class,命名为AdoPage,即建立了一个名为AdoPage的ASP组件,文件命名为Adopage.pas。  第二步:打开Type Library,新建一个方法Get_Page,然后在Get_Page加入一个参数Pconnandsgl,用于传递数据库连接语句和SQL语句,参数选择为BSTR类型。  第三步:新建一个DataModule,放入Adoconnection组件和AdoQuery组件,将Data Module命名为AdoDataModule。由于新建立的组件中的方法Get_Page要从DataModule中取得数据,所以需在Adopage.pas的Uses子句中加入AdoDataModule,然后声明一个数据模块的变量fadodm,同时加入Initialize和Destroy这两个方法,以便在ASP组作中生成数据模块。Adopage.pas具体代码如下所示:  unit Adopage;  interface  uses   ComObj, SysUtils, Classes, ActiveX, AspTlb, Pbasedata_TLB, StdVcl, AdoDataModule;   //将AdoDataModule加入USE子句  type   T Adopage = class(TASPObject, Ibasedata)   private   fadodm:TAdoDataModuleform;   protected   procedure OnEndPage; safecall;   procedure OnStartPage(const AScriptingContext: IUnknown); safecall;   procedure get_page(const pconnandsql: WideString); safecall;   public   procedure initialize;override;   destructor destroy;override;   end;  implementation  uses ComServ,forms;  destructor Tadopage.destroy;  begin   inherited;   fadodm.Destroy;  end;  procedure Tadopage.initialize;  begin   inherited;   fadodm:=tadodmform.Create(forms.application);  end;  第四步:建立通用的分页显示数据的方法get_page,具体代码如下:  procedure Tadopage.get_page(const pconnandsql: WideString);  var i,j,n:integer;  connstr,sqlstr:widestring;  rs:_recordset;  cur_url:widestring;  page_no:integer;  begin  //首先从传递过来的参数中分别取出连接串和SQL语句  pconnandsql:=uppercase(pconnandsql);   i:=pos('CONNSTR',pconnandsql);  j:=pos('SQLSTR',pconnandsql);  if i=0 or j=0 then   begin   response.write('数据库连接串或SQL语句错误!');   abort;   end;  for n:=I+8 to j-1 do   connstr:=connstr+pconnandsql[n];  for n:=j+7 to length(pconnandsql) do   sqlstr:=sqlstr+pconnandsql[n];   //将取得的连接串和SQL语句分别赋给ADOconnection和ADOQuery  fadodm.adoconnection1.connstring:=connstr;  fadodm.adoquery1.sql.add(sqlstr);  //以下为打开数据库并进行分页的过程  try   fadodm.adoquery1.open;   //打开数据库   rs:=fadodm.adoquery1.recordset;  //取得当前打开页面的URL和页码   try   if request.servervariable['url'].count>0 then   cur_url:= request.servervariable.item['url'];   if request.querystring['page_no'].count>0 then   page_no:=request.querystring.item['page_no']   else   page_no:=1;   except   end;   rs.pagesize:=20;   //每页设为20行   rs.AbsolutePage:=page_no;   //页面定位   response.write('共'+inttostr(rs.pagecount)+'页& ');   response.write('第'+inttostr(page_no)+'页& ');  //对每个页码建立超链接  for i:=1 to rs.pagecount do  response.write('<a href="'+cur_url+'?page_no='+inttostr(i)+'">'  +inttostr(i)+'</a>');  //数据记录按表格显示  response.write('<table>');  //取得表格标题  response.write('<tr>');  for I:=0 to fadodm.adoquery1.fields.count-1 do   response.write('<td>'+fadodm.adoquery1.fields[i].fieldname+'</td>');  response.write('</tr>');  j:=1  with fadodm.adoquery1 do   while (not eof) and j<=rs.pagesize do   begin   response.write('<tr>');  //取得表格内容  for i:=1 to fields.count do   response.write('<td>'+fields[i].asstring+'</td>');   response.write('</tr>');   next;   end;  response.write('</table>');  fadodm.adoquery1.close;  except  response.write('数据出错啦!');   end;  end;  以上即为取得通用分页数据的过程,需要注意的是编译时部分函数会出错,只需在USES子句中加入sysutils、classes和adodb单元即可。  第五步:编译并注册adopage组件,即可在ASP代码中调用,调用示例如下:  <%  dim webpageobj  set webpageobj=server.createobject("padopage.adopage")  webpageobj.get_page("conn=provider=SQLOLEDB.1;presist security info=false;  user id=sa;initical catalog=sale_data;data source=(local),  sqlstr=selectfrom customer")   %>  通过以上步骤,我们就顺利地利用Delphi开发出了具有分页功能的ASP组件了。 
      

  2.   

    你到底是想开发组件还是显示数据??显示数据的话用sql语句控制就可以了啊
      

  3.   

    当然是显示数据哦
    请告诉我怎样用SQL 语句控制,
    比如每页显示20条记录,我想转到第3页,怎样写?
      

  4.   

    用ADO组件中的tadodataset和tadocommand就可以了,很方便,用tadodataset中recordset的一系列属性就可以了
      

  5.   

    谢谢 loveyinger(lxy) , 我看到了曙光 
    我开始也是这样想的 就是不知道具体怎样做?
    你能不能发给一个例子给我([email protected]) 或者网上有类似的资料。
      

  6.   

    可以使用ADO的原生对象来解决,李维的书上有例子的
      

  7.   

    Re: czzw(山水) 李维的我基本上都有,是不是ADO/MTS/COM+ 那本书?
     我初步看了,没有看到书上的例子。
     只有你提供例子,我满分给你,佷需要你的帮助。