三层结构数据传递的格式为数组形式,在客户端出问题,请教大家(50分)

  • 主题发起人 主题发起人 delphiboy
  • 开始时间 开始时间
D

delphiboy

Unregistered / Unconfirmed
GUEST, unregistred user!

中间层:
---------------------
GWData:variant* |
---------------------
if adoqueryA.RecordCount>0 then
begin
GWData:=VarArrayCreate([1,adoqueryA.RecordCount,0,5],varOleStr);
AdoqueryA.First;
i:=1;
while not AdoqueryA.Eofdo
begin
GWData[i,0]:=AdoqueryA.fieldByName('收货单Nr').AsString;
GWData[i,1]:=AdoqueryA.fieldByName('收货记录号码').AsString;
GWData[i,2]:=AdoqueryA.fieldByName('供应商Nr').AsString;
GWData[i,3]:=AdoqueryA.fieldByName('收货人').AsString;
GWData[i,4]:=AdoqueryA.fieldByName('收货日期').AsInteger;
adoqueryA.Next;
inc(i);
end;
end else
begin
GWData:=Null;
end;
客户端:
if Main.ConnectionBroker2.AppServer.GetYzdwfkjl(querysql,Gwdata,ErrorInfo) then
begin
RowCount :=VarArrayHighBound(Gwdata,6) ;
--这里报错!为什么?
listview2.items.clear ;
for i:=0 to (ROWcount-1)do
begin
listview2.Items.Add;
listview2.Items.Caption:=trim(Gwdata[i,0]);
listview2.Items.SubItems.add(trim(Gwdata[i,1]));
listview2.Items.SubItems.add(trim(Gwdata[i,2]));
listview2.Items.SubItems.add(trim(Gwdata[i,3]));
listview2.Items.SubItems.add(trim(Gwdata[i,4]));
listview2.Items.SubItems.add(trim(Gwdata[i,5]));
end;
end else
begin
MessageDlg(ErrorInfo,mtError, [mbYes], 0);
end;
客户端收到数据后,得到行数的时候报错,为什么?
 
怎么没有人回答?
 
在variant类型赋值之前必须使用vararraylock,赋值完毕后使用vararrayunlock;
如果在COM里使用VARIANT类型建议variant类型改为olevariant;
×××注意:不管在读或写variant或olevariant类型时,都要先锁定,完成操作后解锁,尤其是将上述类型作为参数进行传递时××××××××××××××××××××××
上述语句可以修改为:
var GWData:variant;p:pointer;
begin
GWData:=VarArrayCreate([1,adoqueryA.RecordCount,0,5],varOleStr);
p:=vararraylock(GWData);//锁定VARIANT
begin
//read the date what you want
end;
vararrayunlock(buf);
//解锁
end;
 
刚才有个手误:
var GWData:variant;p:pointer;
begin
GWData:=VarArrayCreate([1,adoqueryA.RecordCount,0,5],varOleStr);
p:=vararraylock(GWData);//锁定VARIANT
begin
//read the date what you want
end;
vararrayunlock(GWData);
//解锁
//下面可以传出 result:=GWData;
end;

 
先判断一下是否是数组
if varisarray(Gwdata) then
...
 
谢谢xycall,的回答。谢谢。那我的客户端怎么回报错呢?是不是不能用
VarArrayHighBound啊
 
察看数组下标索引值是否越界??
 
下面文章参考
=================================
COM/DCOM如何传递数组
因为COM/DCOM对象都不在Client程序运行的内存空间(内进程COM对象除外,即便如此,为了统一接口,内进程的COM也不得传递指针),而且在Win32中所有的程序都有自己独立的2GB的内存空间,程序与程序之间传递指针(内存地址)是毫无意义的,而数组、字符串等大量的数据在程序中都是分配一定的内存空间,然后用指针加内存偏移量来存取数据的,这时,如何在COM/DCOM对象中如何传递呢?
在Win32中引入了一新变量Variant,可以通过Variant传递数组。具体的实现方法,用Delphi实现为:
Server(COM/DCOM程序)端:
procedure TTestDCOM.Send4(Size: Integer;
D1: OleVariant);
type
TData=array [0..999]of Byte;
Var
Data:TData;
i:Integer;
begin
for i:=0 to Size-1do begin
Data:=D1;
end;
end;

Cleint端:
Var
D1:OleVariant;
begin
D1:=VarArrayCreate([0,99],varByte);
{
D1[1]:=45;
.... //将值存入D1中
}
S.Send4(99,D1);
//S是TestDCOM对象
end;
 
后退
顶部