在COM+中,如何传递一个Record,或一个Record数组?
(可以传递ADO的记录集吗?好像VB可以,但VB传递的记录集,Delphi可以用吗?)
当然可以
看看一下代码
1。定义一个结构
///////////////////自定义的欠费统计结构
towe=record
name:shortstring;
fee0:shortstring; //当月费用
fee1:shortstring; //total费用
end;
poweary=^toweary;
toweary=array[0..20] of towe;
powerecords=^towerecords;
towerecords=record
count:longint;
oweary:toweary;
end;
2。需要两个函数
function Tstat_acf.varianttoowerecords(v: olevariant): towerecords;
var
p:pointer;
begin
p:=vararraylock(v);
move(p^,result,sizeof(towerecords));
vararrayunlock(v);
end;
3。
服务端
function owestat:varaint;
begin
towerecords:=////给他附值
v:=vararraycreate([0,sizeof(towerecords)],varbyte);
P:=vararraylock(v);
move(owerecords,p^,sizeof(towerecords));
vararrayunlock(v);
result:=v;
end;
4。客户端接收
var
v:variant;
v:=socketconn.AppServer.owestat(owedate);///返回统计值
owerecords:=varianttoowerecords(v);
一般用clientdataset传递数据包
VB传递的记录集理论上可以被delphi接受,但你要在客户端(函数接受方)声明一个
这种类型的变量,你有办法声明吗?
可以;你可以将ADO的数据作为一个Variant类型的变量进行传送:
这是服务端的一个方法的代码:
function TADORec.getData: OleVariant;
begin
AdoDataSet1.Open;
result := adodataset1.RecordSet;
end;
客户端调用服务端方法的代码:
procedure TForm1.Button2Click(Sender: TObject);
var
vData : variant;
begin
DCOMConnection1.Connected := true;
vData := DCOMConnection1.Appserver.GetData;
AdoDataSet2.Recordset :=IUnknown( vData ) as _RecordSet;
end;
我想用VB传送的记录集Delphi应该也可以用,只要它用Variant类型的变量封装记录集。ADO的记录集跟使用的语言是无关的。