请问如何才能从Com组件中返回recordset或者dataset!现在我用oleVariant,传到客户端无法读取!(100分)

  • 主题发起人 主题发起人 yy6666
  • 开始时间 开始时间
Y

yy6666

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何才能从Com组件中返回recordset或者dataset!现在我用oleVariant,传到客户端无法读取!
ador:= createoleobject('adodb.recordset');
ador.open(sql);
然后用olevariant把ador传到客户端,但是客户端无法读出aodr的信息。为什么?
 
直接传recordset呀
 
是啊,可是不能定义成recordset类型啊,COM只能让我返回olevariant类型的变量啊,到了客户端不认啊?
 
ADO组件不是有个Data: OleVariant,把它传给客户端试试,
或ADODataSet.SaveToFile(FileName) --> FileToVariant ->Client
 
两个办法:
1,传回idispatch*,强制类型转换
2,在客户端定义一个recordset类型的指针,用void**或^Pointer把这个指针的地址送
进去,使其指向recordset
 
使用的类型应该是*recordset或者**recordset,我记不清了,
后一个的可能性大一点,我做过的。
 
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1112182
 
利用variant*参数也行
在com对象中定义一个返回variant*的方法
function CallRecordSet: OleVariant;
safecall;
在客户端掉用
RSet:=IDisPatch(IC.CallRecordSet) as _RecordSet;
 
服务端:
function GetRecordset: IDispatch;
safecall;
var
rs: _Recordset;
begin
rs := CoRecordSet.Create;
rs.open(.....);
Result := rs;
end;

客户端:
ADOQuery1.Recordset := AppServer.GetRecordset;
 

function TMyClass.MyShow(const TValue: WideString): IDispatch;
Var QyTemp:TadoQuery;
begin
Qytemp.sql:=Tvalue;
Qytemp.open;
Result:=Qytemp.Recordset;
end;

procedure TForm1.Button1Click(Sender: TObject);
var temp:Tadoquery;
begin
Temp.Recordset:= IDispatch(Test.MyShow('Select * From n7rte')) as _RecordSet;
end;


 
我不太清楚你的实际情况,但你可以试验一下以下方法:
ador.open(sql)是你在服务端定义的方法吗?sql是参数还是返回值(我就认为是参数吧)
打开服务端的程序,在TYPELibrary中修改ador.open(sql)方法;
1、删除原来的方法ador.open(sql),并刷新(注意备份)
2、重新定义方法
方法名:OPEN
参数
1、sql 类型olevariant 方向IN
2、OUT(返回值)类型*olevariant 方向 IN OUT
然后刷新并重新完成方法部分的程序
 
因为oleVariant不能作为返回值,只有*oleVariant可以定义为IN OUT作为返回值
 
后退
顶部