【 tulaoshi.com - 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:=