能否在com/dcom中返回一個數據集(dataset)供asp中使用?(100分)

  • 主题发起人 主题发起人 wen
  • 开始时间 开始时间
W

wen

Unregistered / Unconfirmed
GUEST, unregistred user!
能否在com/dcom中返回一個數據集(dataset)供asp中使用
要求如下:
asp調用一com組件,com產生一個數據集,asp再調用這個數據集進行處理.
如何實現,那位大俠知道.
 
沒人知道啊?
 
设置返回值或一个输出变量设置为olevariant类型,然后将ADO记录集直接给该变量即可。
我们一直这样干,如果你用Delphi5的ADO Dataset组件,甚至可以自己构造ADO记录集
 
用vb寫com/dcom組件時如何實現該功能?
 
VB的recordset就是这种类型,应该可以直接传送吧?
 
用ADO, 传送Recordset的Interface
 
附加功能 将问题提前
 
附加功能 将问题提前
 
提问者希望继续讨论请20天内务必回来把问题提前一次
 
我也很想知道,提前!
 
当然可以,先写Server端的程序,后写Web的资料用DCOMConnection连接Server的资料
Server歩骤
1新增一个Web Server Application
2选择CGI Stand-alone EXE File
3在Web Module 新加一个PageProducer,连接Com的资料即可

 
请注意:是在asp方式,不是CGI方式
 
当然可以。
先创建一个ActiveX Libary(命名为MyADOLib),然后创建一个MTS Datamodule(或Active Server Object,我个人偏爱MTS),命名为MyADO。
打开TypeLibary视图,在树图中选择顶层MyADOLib,然后在右侧选Uses Tab,里面有一个Uses TypeLibary列表。
在列表上单击右键,选择Show All Type Libaries,找到Microsoft ActiveX Data Object,打勾。
然后在树图中选择IMyADO,新建一个只读属性,在Attributes/Type下拉框中选择Recordset *。
然后在实现代码里把你Datamodule中的ADO按件的RecordSet指给返回值即可。

注意在Datamodule中要手动在Uses句中加入ADODB_TLB,一定要放到ADODB的后面,千万别搞错。
 
to addie:
返回一个数据集在delphi,vb,java中都没有问题,
问题在asp程式中如何调用,请举个例子.(好象要进行类型转换??)
thanks
wen
 
这时返回的已经是ADO RECORDSET了。在ASP中可以使用。

TypeLibary中的部分代码(由Delphi自动生成):

IUserInfo = interface(IAppServer)
['{4CA2EFDF-C551-4E5B-949E-27281A7F6BA9}']
function Get_Information: Recordset; safecall;
procedure GetAll; safecall;
function Login(const UserName: WideString; const Password: WideString): WordBool; safecall;
function QueryByID(UserID: Integer): WordBool; safecall;
function QueryByName(const UserName: WideString): WordBool; safecall;
property Information: Recordset read Get_Information;
end;

DataModule中的部分实现代码:

Uses
Window......, ADODB, ADODB_TLB; //顺序不能错。

type
TUserInfo = class(TMtsDataModule, IUserInfo)
Conn: TADOConnection;
qyLogin: TADOQuery;
qyByID: TADOQuery;
qyByName: TADOQuery;
tbAll: TADOTable;
private
FRecordSet: TCustomADODataSet;
protected
class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
procedure GetAll; safecall;
function Get_Information: Recordset; safecall;
function Login(const UserName: WideString; const Password: WideString): WordBool; safecall;
function QueryByID(UserID: Integer): WordBool; safecall;
function QueryByName(const UserName: WideString): WordBool; safecall;
public
end;
....


function TUserInfo.Get_Information: Recordset;
begin
Result := _RecordSet(FRecordSet.RecordSet); // _RecordSet 为ADODB_TLB._RecordSet, 所以在Uses中的顺序不能错。
end;

function TUserInfo.Login(const UserName, Password: WideString): WordBool;
begin
with qyLogin do
begin
Close;
Parameters[0].Value := UserName;
Parameters[1].Value := Password;
Open;
Result := not (Bof and Eof);
end;
FRecordSet := qyLogin;
end;
....
end.

ASP调用代码:
<%
dim MyLogin
Set MyLogin = Server.CreateObject("xxLib.UserInfo")
if MyLogin.Login("addie", "chenjin") then
Response.write MyLogin.Information.Fields("FullName").Value
else
Response.Write "Login Failed"
end if
%>
 
多人接受答案了。
 
值得关注
 
我的asp组件为什么不能传参数!请高手执教!
我创建了一个asp对象!
type
TWebFunc = class(TASPObject, IWebFunc)
protected
procedure OnEndPage; safecall;
procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
function Test(var str: OleVariant; str2: PChar): OleVariant; safecall;
end;
像做一个函数Test,让它有返回值,但在ASP端调用总不成功!不知道什么原因!
还有一个问题,如果写成过程
procedure Test(var str,str2:OleVariant);safecall;
的话,我想改变str,str2的值,在asp端也不成功!
请大虾帮忙分析一下原因,
不知道有没有人遇到过同样的情况?

在asp文件中很简单啊!
Dim str1,str2,str3
str1="1"
str2="2"
str3="3"
Set DelphiASPObj = Server.CreateObject("ArticleSave.WebFunc")
或DelphiASPObj.Test str1,str2,str3
或str3=DelphiASPObj.Test(str1,str2)
或str3=DelphiASPObj.Test str1,str2
都不行!是asp组件的问题?还是调用的问题?
 
如果用dbe可不可能呀?[:(]
 
后退
顶部