用DELPHI开发的ACTIVEX如何接收ASP的数据集

dacsd 2004-12-04 05:13:38
我用DELPHI开发一个ACTIVEX控件,希望从ASP中获得数据集,不知如何做,ASP已经得到数据,关键是ACTIVEX如何接收。

如下,asp已经获得数据集RS,如何才能让ACTIVEX中接收到数据集RS,关键是ACTIVEX如何接收,也就是在DELPHI中如何写代码。它与接收字符串有何不同。其他的参数都可以正常接收。


<%
Set conn = Server.CreateObject("ADODB.Connection")
set rs=server.createobject("ADODB.Recordset")
conn.Open "driver={SQL Server};server=127.0.0.1;uid=sa;pwd=88888888;database=db"

strsql="select * from gtd"

rs.Open strsql,Conn,1,1

%>

请高手帮忙解答
...全文
283 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
oy145 2004-12-10
  • 打赏
  • 举报
回复
给个例子你参考,希望能帮上忙

用DELPHI开发一个通用的显示分页Web页面的ASP组件。

  第一步:新建一个Activex Library,命名为PadoPage,然后再新建一个Active Server Object Class,命名为AdoPage,即建立了一个名为AdoPage的ASP组件,文件命名为Adopage.pas。

  第二步:打开Type Library,新建一个椒℅et_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组件了。

dacsd 2004-12-09
  • 打赏
  • 举报
回复
再次将帖子提前。
dacsd 2004-12-08
  • 打赏
  • 举报
回复
看样子这个问题比较难。
ljyt 2004-12-07
  • 打赏
  • 举报
回复
如果activex控件是在客户端执行的话,那就不行的,如果实在服务器端执行,是可行的,delphi的dataset对象有_Recordset接口可以利用的
tjkjdx1 2004-12-07
  • 打赏
  • 举报
回复
学习,帮搂主,顶上去~
何鲁青 2004-12-07
  • 打赏
  • 举报
回复
哦,明白了,你的想法挺好的,能够发挥两者的优点.
不过我不会,陪你一起等.期待高手解决!!!
dacsd 2004-12-07
  • 打赏
  • 举报
回复
我是用delphi作activeX控件,用ASP调用,如果把读取数据的功能放在activeX中的话,需要经常修改activeX,也就是要经成性的重新编译程序,同时,通用性也不强,因为ASP的编写相对简单,用记事本就行,更何况,不同的地方读取的数据也是不同的,我让这个控件做到只接收asp的数据,从而让他适应不同的地方。
dacsd 2004-12-07
  • 打赏
  • 举报
回复
独败您好!
您的想法是我现在用的,这个办法有一些缺点,它不如通过asp将数据集传过去方便。
failer 2004-12-07
  • 打赏
  • 举报
回复
ole com支持的数据类型是有限制的。
如果要传RecordSet类型的参数的话,可以试一试OleVariant类型。在程序里再将它视为RecordSet类型使用。这种方法仅仅是我的建议,没有试过。
其实,如果是我做的话,我会把数据的读取放到ActiveX对象中。可以在ASP中将选择的SQL语句传给COM对象,然后用Delphi的控件去连接数据库。
dacsd 2004-12-07
  • 打赏
  • 举报
回复
procedure TdacsdVIEW.ys(fname,BH: WideString; blank: WordBool);
如上,我在该activeX控件中接收asp的参数的方法,其中fname,BH是字符串,blank是逻辑型,而WideString和WordBool都是可以在*.tlb中编辑时增加变量,尔后从参数中写上参数名,而WideString和WordBool等等的类型都是选择的,我在里头没有看到有_Recordset类型的,请罗大侠指教。
dacsd 2004-12-07
  • 打赏
  • 举报
回复
终于等到高手了,我的activeX就是在服务器上执行的,请罗大侠明示。
谢谢
何鲁青 2004-12-06
  • 打赏
  • 举报
回复
不会,而且不知道搂住这种做法到底有什么实用价值。
难道delphi不能直接读数据库吗???
帮顶
ghchen 2004-12-06
  • 打赏
  • 举报
回复
不会,关注,顶
dacsd 2004-12-06
  • 打赏
  • 举报
回复
请各位高手看看
surdon 2004-12-04
  • 打赏
  • 举报
回复
陪你一起等

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧