这是我从网上找了一段说明照做的,经过调试,编译和注册都没问题,就是在ASP中调用时出错???我想是传递参数类型出错的,高手你想可能是什么原因???**************************************************************
http://www.sina.com.cn 2001/07/31 10:57 赛迪网-中国计算机报 车涛
随着网络技术的发展和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=selectfrom customer") %> 通过以上步骤,我们就顺利地利用Delphi开发出了具有分页功能的ASP组件了。*************************************************************************************
我是这样调用的<% Set DelphiASPObj = Server.CreateObject("Project2.AdoPage")
DelphiASPObj.Get_Page("conn=provider=SQLOLEDB.1;presist security info=false;user id=sa;initical catalog=rhGao_shop;data source=(local),sqlstr=select * from customer")%>
http://www.sina.com.cn 2001/07/31 10:57 赛迪网-中国计算机报 车涛
随着网络技术的发展和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=selectfrom customer") %> 通过以上步骤,我们就顺利地利用Delphi开发出了具有分页功能的ASP组件了。*************************************************************************************
我是这样调用的<% Set DelphiASPObj = Server.CreateObject("Project2.AdoPage")
DelphiASPObj.Get_Page("conn=provider=SQLOLEDB.1;presist security info=false;user id=sa;initical catalog=rhGao_shop;data source=(local),sqlstr=select * from customer")%>
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货