asp & com+ & recordset
用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




