COM+组件如何同时为delphi和asp重用?(100分)

  • 主题发起人 主题发起人 goldenforest75
  • 开始时间 开始时间
G

goldenforest75

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是这样的:我需要写一些COM+的组件,封装业务规则和数据库连接操作,但问题是,我
需要使用Delphi和asp都可以调用它。这对于一般的执行insert的操作的都没问题,但是,如果
我要返回一批数据,比如查询或者要批量处理数据,就没有办法返回了;
我知道VB里面使用COM+返回recordset,这样VB或者ASP都可以直接调用。
我看delphi使用的是Midas技术,在COM+将数据打包成ole变量数组,然后在客户端使用
clientdataset将其解析,但是这样传回的数据报ASP是不认识的。
我们是否要放弃delphi来使用VB这种破玩艺来干活?
还望各位大虾赐教!
 
通过Delphi也可以返回Recordset。
例:
.....
uses .....AdoInt;
......
function TMyObj.GetRS: IDispatch;
var
rs : Recordset;
Con : Connection;
ConStr : string;
sql : string;
begin
sql := 'SELECT * FROM Customers';
ConStr := 'Provider=.....';
//Your connection string here
Con := CoConnection.Create;
Con.Open(ConStr, '', '', adConnectUnspecified);
rs := CreateComObject(CLASS_Recordset) as Recordset;
rs.CursorLocation := adUseClient;
rs.Open(sql,Con,adOpenDynamic,adLockReadOnly,adCmdText);
rs.Set_ActiveConnection(nil);
Result := rs;
end;

 
请教Hongjiang:
返回的recordser对象,在VB或ASP中该怎么调用?
我照着你的代码在DELPHI中写了一个组件,并用regsvr32注册,在VB中如下调用:
dim delphi_rs As New MyObj '注:MyObj为DELPHI中的接口
dim com_rs As New ADODB.Recordset

set com_rs=MyObj.GetRS '注:GetRS为MyObj的一个方法,就是Hongjiang给出的代码部分
然后就出现访问无效内存的错误。

我在VB中怎样才能得到DELPHI编写的Recordser组件返回的结果?

 
返回XML封包不就可以啦
 
to 大鱼儿:
能不能说得详细一点?我真的很需要帮助!
 
我也关注。。。
 
关键是Hongjiang的代码中GetRS方法返回的是 IDispatch类型的,我在DELPHI只做了测试:
procedure TForm1.Button1Click(Sender: TObject);
var
local_rs:recordset;
begin
local_rs:=rs.GetRS as recordset;
adodataset1.Recordset :=local_rs;
datasource1.dataser:=adodataset1;
dbgrid1.datasource:=datasource1
end;

这样的话,则可得到返回的recordset,但是在VB中没有as这种方法啊,要如何才能得到返回的
recordset?难道要改GetRS方法的返回类型吗?
 
xml是最好的,但是如何处理哪
 
请问:我在试上面的例子时,iDispitch*不可以做为返回类型。请问我该如何做?是加入
type Library吗?该加哪一个?
 
你的方法返回BStr的参数。
把要返回的记录用转换成XML,就可以返回了
和返回字符串是一样的道理,具体XML编码,你可以参考XML的资料
 
不过可以返回对象嘛?
 
lipingcool:
我给你的代码肯定是没问题的。我刚才写了一个Demo, 然后用ASP调用,
运行很正常啊。用XML传递也可以, 方法如下:
首先你要将msxml3.dll和msado15.dll Import进来(我这儿用的是MSXML 3.0和ADO2.5)。
注意,我这儿用的是ADO2.5,因为我要用它的将Recordset直接保存到xmldom object的
功能。
.....
uses .....ADODB_TLB, MSXML2_TLB;
......
function TMyObj.GetRS: WideString;
var
rs : Recordset;
xDoc: IXMLDOMDocument;
Con : Connection;
ConStr : string;
sql : string;
begin
sql := 'SELECT * FROM Customers';
ConStr := 'Provider=.....';
//Your connection string here
Con := CoConnection.Create;
Con.Open(ConStr, '', '', adConnectUnspecified);
rs := CreateComObject(CLASS_Recordset) as Recordset;
rs.CursorLocation := adUseClient;
rs.Open(sql,Con,adOpenDynamic,adLockReadOnly,adCmdText);
xDoc := CoFreeThreadedDOMDocument30.Create;
rs.Save(xDoc,adPersistXML);
Result := xDoc.xml;
end;

因为我写MTS/COM+基本上都用VC,所以对Delphi写MTS/COM+不是很熟,上面的代码
很可能有问题。总体上来说,我很喜欢Delphi, 但写MTS/COM+我还是喜欢VC的ATL。
zljzyj:
IDispatch*是不允许作为返回类型的,应该用IDispatch**作为返回类型。
 
lipingcool:
忘了告诉你,VB我也试了,没有问题,代码如下:
dim delphi_rs As New MyObj
dim com_rs As ADODB.Recordset //Recordset, Object etc 都可

set com_rs=MyObj.GetRS
 
我的方法是这样的:
在Type Library 中点你的工程名,可以看到一个Uses表签,里面是你工程所引用的类库
点击右键,Show All Type Library,选中ADO2.6,然后在你的方法中就可以返回_Recordset **
了,你还会遇到一个小问题,相信你自己可以解决。
 
To :HongJiaang 保存到XML我已经试了,当执行到save语句时提示错误,
有谁正确通过了?该如何改呢?
 
以前我答过这样一个问题,方法是在COM组件中引入ADO RECORDSET接口。
你查一下吧,我忘了ID号了。
 
To zljzyj:
1.ADO2.1以前的版本不能直接保存到XMLDOM对象中,只能保存为XML文件.
2.如果直接保存到XMLDOM对象中的话,Save方法的第一个参数是VARIANT类型,
并且是VT_DISPATCH类型.
你试一下
rs.Save(IDispatch(xDoc),adPersistXML);
 
to Hongjiang:
我在VB中的调用方法和你的一样,但是老报内存错,能不能把你的信箱给我,我把代码发给你
看看,我实在是不知道该改什么地方了!拜托!
我的EMAIL:lipingcool@263.net
 
lipincool:
我的信箱 hongjiang@yahoo.com
你给我的代码最好都用英文, 我用的不是中文Windows.
 
后退
顶部