如何将一个ADO记录集从Com Server中传递出来?(100分)

  • 主题发起人 主题发起人 roshui
  • 开始时间 开始时间
R

roshui

Unregistered / Unconfirmed
GUEST, unregistred user!
比如如下情形:
在一个COM Server(DLL形态的,不支持自动化接口)中有一个ADODataSet1,我如何将这个ADODataSet1传出来供客户端使用
通过指针好像不行:)
请大家指点迷津,谢谢!

在接口中我这样定义
type
IFrameServices=interface(IUnknown)
function GetCodeSet(const TypeCode:WideString;var CodeSet:Variant):WordBool ;stdcall;
^^^^^^^^^^^^^^^^^我希望传出来的时一个ADODataSet
end;

我应该如何做呢????
 
我的COM 客户端也是用Delphi编写,我希望用一个ADODataset对象来接受传出来的ADO记录集.

我部知道我是否表述清楚了,在线等待中.请大家随时提问.

今天一定要解决啊!!!
 
只传指针肯定不行
把它作为一个数组传出来
 
我不想被逼得Com Server和COM Client都要用ADO的原生对象来解决这个问题啊,那样效率太低.
 
TADODataset不是有个recordset属性,它就是原生的ADO接口。所以我认为穿
接口是可行的.
 
to XEEN
那样的话我在客户端也要用ado native object 才能使用,我想把它直接和data aware 控件联系起来使用啊
你知道如何将一个ADO的原生接口转化为一个DELphi的ADO vcl的接口吗?
比如
Dataset:Recordset;
AdoQuery:TadoQuery;
......
AdoQuery.Recordset:=Dataset; ___如何使这一句梦想成真呢?
错误信息是:
[Error] Unit2.pas(65): Incompatible types: 'ADODB_TLB._Recordset' and 'ADOInt._Recordset'


 
把CodeSet的类型改为Variant*[in,out]
CodeSet := ADODataset.recordset;
客户端 uses adoint;
var
MyRecordset :_recordset;

MyRecordset := IUnknown(CodeSet) as _recordset;
 
to 碧血剑

如果作为一个数组传递的话,我还不如传ADO的原生接口好了.[:(][:(][?][?]
 
to xeen

我先试试
你用qq吗?

我的email:eaglewang@citiz.net
 
非得用DataAware控件吗?用了这法子就不灵了,而且用了DataAware控件运行效率
狂降,用原生ADO效率是最高的.
 
to xeen

我不想被逼得Com Server和COM Client都要用ADO的原生对象来解决这个问题啊,那样开发效率太低.

[:(][:(][:(]
 
to
xeen
不行啊,我想IUnknown(Temp) as _recordset这样可能是不对的吧[?]
 
实在要用也可能用Tdatasetprovider 和 tClientdataset,总之DataAware所能识别
的数据集结构只有Borland才知道,而ADO的记录集的结构肯定与它不一样的.
 
高手们,请支招吧...[:(][:(]
 
以下代码成功:
服务器端:
procedure TEasyDcomServer.GetData(var MyData: OleVariant);
begin
adodataset1.Close;
adodataset1.Open;
MyData := adodataset1.Recordset;
end;
客户端:
procedure TForm1.Button1Click(Sender: TObject);
var
MyRec:variant;
Myrecord:_recordset;
begin
Dcomconnection1.AppServer.GetData(myRec);
Myrecord := IUnknown(MyRec) as _recordset;
AdoDataset1.Recordset := myrecord;

end;
 
非常感谢xeen,紧张施工ing
 
to xeen
兄弟愚钝,再请指点
我的COMServer是进程内的
以下是我的实现:

COM Server端:
function TFrameServices.GetCodeSet(const TypeCode: WideString;
var CodeSet: OleVariant): WordBool;
begin
......
ADOQuery.Active:=True;
CodeSet:=ADOQuery.Recordset;
Result:=True;
end;

COM Client端:
procedure TForm2.Button1Click(Sender: TObject);
var
Temp:OleVariant;
TempRecord:_Recordset;
begin
FIFrameServices.GetCodeSet('AAC050',temp);
MyTempRecord:=IUnknown(Temp) as _recordset;
ADOQuery.Recordset:=TempRecord; ————error
DataSource1.DataSet:=ADOQuery;
end;
出错信息为:
[Error] Unit2.pas(65): Incompatible types: 'ADODB_TLB._Recordset' and 'ADOInt._Recordset'

请诸位指点,不胜感激!
 
uses ADOInt,不要uses ADODB_TLB.这两个重复了.
 
to xeen
这下编译是没有问题了,可是一旦运行就错了,说是——访问冲突

我inspector了一下,好像temp没有接受到任何的东西。

要不,我不把代码发给你,你帮我调试一下,行吗?

谢谢,请回复。
 
xeen@163.net 发给我可看看.
 
后退
顶部