CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  ASP

asp & com+ & recordset

楼主newmanforask(aaa)2002-03-22 09:31:26 在 Web 开发 / ASP 提问

用vb写了个com+组件,其中一个函数定义如下  
  public   sub   a   (byref   rs   as   adodb.recordset)  
  即rs是个输出参数,且是个无连接的记录集(activeconnection=nothing)  
  在asp中我该怎么得到这个输出参数呢 问题点数:100、回复次数:25Top

1 楼pencil_xx(TureApple)回复于 2002-03-22 09:34:42 得分 0

关注中。。  
   
  Top

2 楼QSQ99(乡巴佬)回复于 2002-03-22 09:40:53 得分 0

up  
  Top

3 楼xuchu(许褚)回复于 2002-03-22 12:56:23 得分 0

public   function   a()  
  ...  
  a=rs  
  end   function  
   
  --------  
  in   asp  
  --------  
  set   obj=server.createobject("dll.class")  
  rs=obj.a()Top

4 楼julyclyde(Java初学(大学不教只好自己学))回复于 2002-03-22 13:01:58 得分 0

用vb写了个com+组件????Top

5 楼newmanforask(aaa)回复于 2002-03-22 13:04:34 得分 0

如果recordset是在参数中呢,有办法解决吗Top

6 楼ruirui521(枫之舞)回复于 2002-03-22 13:11:26 得分 0

能够传递对象吗?  
  反正我在java里是经常用这样做的。Top

7 楼ruirui521(枫之舞)回复于 2002-03-22 13:11:59 得分 0

能够传递对象吗?  
  反正我在java里是经常用这样做的。Top

8 楼Lostinet(Hello)回复于 2002-03-22 13:27:50 得分 0

vb的参数的OUT可以不可定义的么???(VB有么?)  
  就byref   rs   as   adodb.recordset???Top

9 楼xuchu(许褚)回复于 2002-03-22 13:27:51 得分 10

public   function   a(rs)  
  ...  
  a=rs  
  end   function  
   
  --------  
  in   asp  
  --------  
  set   obj=server.createobject("dll.class")  
  rs=obj.a()Top

10 楼julyclyde(Java初学(大学不教只好自己学))回复于 2002-03-22 13:38:50 得分 0

没听说过用VB写COM/COM+/DCOM的  
  VB没有out参数Top

11 楼onice(西瓜的眼泪)回复于 2002-03-22 13:49:28 得分 0

嬉嬉,来看看有谁会的!Top

12 楼newmanforask(aaa)回复于 2002-03-22 13:55:33 得分 0

如果各位对vb写COM/COM+/DCOM  
  是否可以有输出参数有怀疑,请试一下以下的例子  
   
  activex   dll  
  public   sub   myfunction(byref   aaa   as   variant)  
  aaa=100  
  end   sub  
   
  asp:  
  dim   myvariant    
  myvariant   ="1"  
  set   obj=createobject("mydll.myclass")  
  result=obj.myfunction(myvariant)  
  response.write   myvariant  
  set   obj=nothingTop

13 楼subzero(赘姆烂壳)回复于 2002-03-22 16:22:01 得分 10

不知道你的想法是否如此,看看吧!    
  public   function   getoRs   ()   as   adodb.recordset  
            dim   oRs   as   Adodb.recordset  
            set   oRs   =   new   Adodb.RecordSet  
            oRs.CurSorLocation=adUseClinet  
            oRs.open"select   *   from   from   tab1",activeconnection  
            set   oRs.activeconnection   =   nothing  
            set   getoRs=oRs  
  end   function  
  Top

14 楼julyclyde(Java初学(大学不教只好自己学))回复于 2002-03-22 18:15:56 得分 0

newmanforask(aaa)   :  
   
  VB写的也就是ActiveX而已  
  你那个Function没有设置返回值,result=obj.myfunction(myvariant)读得到数吗?Top

15 楼zcflion(吃大白菜的鸟--菜鸟)回复于 2002-03-22 19:50:34 得分 0

对啊!!com+???怀疑Top

16 楼julyclyde(Java初学(大学不教只好自己学))回复于 2002-03-22 19:54:21 得分 10

强烈抗议用VB写组件  
  VB的伪编译代码,运行时(特别是开机后第一次)效率之低,令小弟佩服,佩服!  
  我用人脑都比它算得快。Top

17 楼newmanforask(aaa)回复于 2002-03-25 10:15:06 得分 0

to   julyclyde(foreverkok.yeah.net):麻烦自己试一下,的确可以返回  
  如果你不喜欢vb你也可以告诉我如果用c++的话,应该怎么做。  
   
  activex   dll  
  public   sub   myfunction(byref   aaa   as   variant)  
  aaa=100  
  end   sub  
   
  asp:  
  dim   myvariant    
  myvariant   =1  
  set   obj=createobject("mydll.myclass")  
  result=obj.myfunction(myvariant)  
  response.write   myvariant  
  set   obj=nothing  
   
  to   subzero(赘姆烂壳)    
  是在参数里返回,不是函数的返回值,因为存在多个参数要返回  
  Top

18 楼julyclyde(Java初学(大学不教只好自己学))回复于 2002-03-25 18:46:52 得分 0

byref进去一个变量,并不是标准的COM的out参数的实现方法啊Top

19 楼julyclyde(Java初学(大学不教只好自己学))回复于 2002-03-25 18:47:56 得分 0

那样写进去,并不按照函数的返回值来处理  
   
  我是不相信。要么你发给我那个DLL让我玩玩?  
  renxiaolei@lol365.com  
  加上你的数字签名Top

20 楼karma(无为MS MVP)回复于 2002-03-25 23:52:04 得分 70

subzero(赘姆烂壳)   is   correct,   although   there   are   some   typos   in   his   code  
   
  try   this  
   
  VB:  
   
  Public   Function   getoRs()   As   ADODB.Recordset  
            Dim   oConn   As   ADODB.Connection  
            Dim   oRs   As   ADODB.Recordset  
            Set   oConn   =   New   ADODB.Connection  
            oConn.Open   "Provider=SQLOLEDB;Server=localhost;UID=sa;PWD=;Database=pubs;"  
            Set   oRs   =   New   ADODB.Recordset  
            oRs.CursorLocation   =   adUseClient  
            oRs.Open   "authors",   oConn,   adOpenStatic,   adLockReadOnly,   adCmdTable  
            Set   oRs.activeconnection   =   Nothing  
            oConn.Close  
            Set   oConn   =   Nothing  
            Set   getoRs   =   oRs  
  End   Function  
   
   
  ASP:  
  set   rs   =   obj.getoRS()  
  do   until   rs.eof  
    for   n=0   to   rs.fields.count   -   1  
      response.write   rs.fields(n).name   &   "="   &   rs.fields(n).value   &   "<br>"  
    next  
    rs.movenext  
  loop  
  rs.close  
  set   rs=nothing  
   
   
  Top

21 楼karma(无为MS MVP)回复于 2002-03-26 00:53:55 得分 0

here   is   another   way   to   get   recordset   out:  
   
  VB:  
  Public   Function   getRs(ByVal   oRsOut   As   ADODB.Recordset)            
            Dim   oConn   As   ADODB.Connection  
            Set   oConn   =   New   ADODB.Connection  
            oConn.Open   "Provider=SQLOLEDB;Server=localhost;UID=sa;PWD=;Database=pubs;"  
            oRsOut.CursorLocation   =   adUseClient  
            oRsOut.Open   "authors",   oConn,   adOpenStatic,   adLockBatchOptimistic,   adCmdTable  
            Set   oRsOut.ActiveConnection   =   Nothing  
            oConn.Close  
            Set   oConn   =   Nothing  
  End   Function  
   
  ASP:  
  set   obj=createobject("mydll.myclass")  
  set   rs   =   server.createObject("adodb.recordset")  
  obj.getRS   rs  
  do   until   rs.eof  
    for   n=0   to   rs.fields.count   -   1  
      response.write   rs.fields(n).name   &   "="   &   rs.fields(n).value   &   "<br>"  
    next  
    rs.movenext  
  loop  
  rs.close  
  set   rs=nothing  
  set   obj=nothing  
  Top

22 楼newmanforask(aaa)回复于 2002-03-26 13:29:27 得分 0

to     karma(无为)  
  方法1   可行,这我也知道,但我希望是在参数里返回  
   
  但方法2   会出错  
   
  ADODB.Recordset   错误   '800a0bb9'    
   
  变量或者类型不正确,或者不在可以接受的范围之内,要不就是与其他数据冲突。    
   
  是在recordset的open的时候  
  是不是因为recordset和connection在不同的进程里的关系  
  Top

23 楼wjying(葡萄)回复于 2002-03-26 16:04:21 得分 0

这让我觉得很奇怪  
   
  asp可以以函数返回值的形式接受marshal   by   value的对象  
  也可以接受vb中byref声明的返回值参数  
   
  却不能接受vb中byref声明的marshal   by   value的对象返回参数  
   
  btw:     newmanforask   (aaa)是我另一个idTop

24 楼karma(无为MS MVP)回复于 2002-03-26 22:40:46 得分 0

"是不是因为recordset和connection在不同的进程里"??  
   
  are   you   caching   connection   object?   if   not,   they   should   be   in   the   same   thread  
   
  with   the   second   method,   make   sure   you   create   a   ADODB.Recordset   object   in   ASP  
   
  post   your   codeTop

25 楼wjying(葡萄)回复于 2002-03-27 09:54:00 得分 0

in   vb:  
  project1.class1  
   
  VERSION   1.0   CLASS  
  BEGIN  
      MultiUse   =   -1     'True  
      Persistable   =   0     'NotPersistable  
      DataBindingBehavior   =   0     'vbNone  
      DataSourceBehavior     =   0     'vbNone  
      MTSTransactionMode     =   0     'NotAnMTSObject  
  END  
  Attribute   VB_Name   =   "Class1"  
  Attribute   VB_GlobalNameSpace   =   False  
  Attribute   VB_Creatable   =   True  
  Attribute   VB_PredeclaredId   =   False  
  Attribute   VB_Exposed   =   True  
  Public   Function   getRs(ByVal   oRsOut   As   ADODB.Recordset)  
        Dim   oConn   As   ADODB.Connection  
        Set   oConn   =   New   ADODB.Connection  
        oConn.Open   "....."  
        oRsOut.CursorLocation   =   adUseClient  
        oRsOut.Open   "table1",   oConn,   adOpenStatic,   adLockBatchOptimistic,   adCmdTable  
        Set   oRsOut.ActiveConnection   =   Nothing  
        oConn.Close  
        Set   oConn   =   Nothing  
  End   Function  
   
  in   asp:  
  <%  
  set   obj=createobject("project1.class1")  
  set   rs   =   server.createObject("adodb.recordset")  
  obj.getRS   rs   'error   occur   here!!!  
  do   until   rs.eof  
    for   n=0   to   rs.fields.count   -   1  
      response.write   rs.fields(n).name   &   "="   &   rs.fields(n).value   &   "<br>"  
    next  
    rs.movenext  
  loop  
  rs.close  
  set   rs=nothing  
  set   obj=nothing  
  %>  
   
  “是不是因为recordset和connection在不同的进程里”  
  这句话说得不够确切,应该是指不同进程里创建  
   
  如果我另开一个vb的ide   把asp中的code搬到vb中   会报同样的错  
  如果我把所有的代码放在一个vbg中则不会报错  
   
  另我看到一篇文章  
  http://linuxfree.myrice.com/asp/three.htm  
  其中有关于asp调用dll组件的一段描述  
   
    3.   从ASP中调用带参数的类方法和函数时,所有的变量参数一定要用相应的类型转换函数转换后再传入,否则会引起类型不匹配错误,因为VBScript中只有Variant类型,它不能自动转换成其它类型。例如,有如下的函数定义:    
   
    Public   Function   Fun1(p1   as   string,p2   as   integer)   as   integer    
   
    End   Function    
   
    在ASP程序中应如下调用:    
   
    <%    
   
       p1=obj.property1   '   Property1   is   a   string   property    
   
       p2=obj.property2   'Property2   is   an   integer   property    
   
       a=obj.Fun1(cstr(p1),cint(p2))    
   
       a=obj.Fun1("aaa",10)   '   constant   parameter   need   not   be   changed    
   
    %>    
   
  但没有讲到参数是对象的情况Top

26 楼wjying(葡萄)回复于 2002-03-28 21:03:52 得分 0

karma(无为)   (     )    
  大虾,您上哪儿去了阿  
  没有其他办法吗Top

相关问题

  • asp中recordset的问题
  • asp怎么打印recordset?
  • VC中如何返回Recordset到ASP中
  • asp页面创建recordset出错
  • 有关asp的对象recordset的问题?
  • ASP+ACCESS 出现 Recordset 参数错误
  • recordset
  • 关于ASP中ADO的RECORDSET游标方式?
  • ASP连接Sybase后Recordset有些属性不能用了,请教!
  • [求助]ASP中Recordset的光标位置问题

关键词

  • 函数
  • vb
  • asp
  • 组件
  • 参数
  • recordset
  • oconn
  • getors
  • adodb
  • myvariant

得分解答快速导航

  • 帖主:newmanforask
  • xuchu
  • subzero
  • julyclyde
  • karma

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo