走过,路过,高手不要错过,请问 三层中如何通过OleVariant变量传递记录数组?(100分)

  • 主题发起人 主题发起人 jong
  • 开始时间 开始时间
J

jong

Unregistered / Unconfirmed
GUEST, unregistred user!
type
Ta = record
AID : Integer;
AName : array [0..50] of char;
//string[255];
ConnectStr: array [0..400] of char;
IsDefault :Boolean;
end;

var
A:Array [0..100] of Ta;
请问:
1、在服务层中如何定义函数接口将A数组通转变成OleVariant变量传递?
2、客户端如何读出OleVariant变量转换成A数组?
 
高手都去忙什么了,帮帮小弟吧。
 
有什么问题吗?直接搞就行了!
==========================================
服务端构件的IDL接口声明:
HRESULT GetValue([out, retval]Variant * Value);
Delphi实现
function GetValue: OleVariant;
var
ary: array of Ta;
begin
// ......
Result := ary;
// 只有动态数组才能这么搞。
end;
==========================================
客户端的调用:
var
ary: array of Ta;
v: OleVariant;
begin
v := X.GetValue;
if VarIsArray(v) then
ary := v;
// 没事,就这么搞没有问题。
// ......
end;
 
to cpj7406
端户端调用 执行到服务端函数
Result := ary;
// 只有动态数组才能这么搞。
时提示 ‘invalid variant type conversion’
是否类型要转换?
 
var
O_variant:olevariant;
i:integer;
begin
O_variant:=varArrayCreate([0,100,0,3],varVariant);
for i:=0 to 100do
begin
O_variant[i,0]:=100;
//AID
O_variant[i,0]:='ABC';
//AName
//......
end;
 
用 varArray 即可
相关函数
function VarArrayCreate(const Bounds: array of Integer;
AVarType: TVarType): Variant;
function VarArrayDimCount(const A: Variant): Integer;
function VarArrayLowBound(const A: Variant;
Dim: Integer): Integer;
function VarArrayHighBound(const A: Variant;
Dim: Integer): Integer;
还可这样创建多维数组
re := VarArrayCreate([0, reCount - 1], varVariant);
for i := 0 to 10do
begin
v := VarArrayCreate([0, 10], varVariant);
for j := 0 to 10do
begin
v[j] := j;
end;
re := v;
end;
 
强烈同意maze和晚起的小虫
可惜我来迟。
少分点分吧:)
 
问题一已经解决,各位大侠帮我看一看问二。
 
那就要看你接口函数中都作了什么操作,估计八成和数据库有关
 
to :maze
调用的函数是
//设置数据库连接
function TRDM.SetAccount(AID: Integer): Integer;
var i:integer;
begin
Result := 0;
MyDB.ConnectionString := '';
Try
For i:=1 to AccCountdo
begin
if A.AID= AID then
begin
//MyDB.Name := A.AName;
MyDB.Close;
MyDB.ConnectionString := A.ConnectStr;
MyDB.Open;
Result := 1;
break;
end;
end;

except
Result := 0;
end;
end;
 
MyDB.ConnectionString := '';//这句去掉
mydb的状态是open,不能更改ConnectionString
 
谢谢maze,
MyDB.ConnectionString := '';//这句去掉
去掉后,客户端第二次直接调用Dm.ScServer.AppServer.SetAccount(DefAID)不会出错了。
但是如果第二次showmessage(inttostr(Dm.ScServer.AppServer.SetAccount(DefAID)))却出错。
出错信息为‘Access violation at address 0048dd2e in module’ scktsrvr.exe
可能是返回不了整形值。
 
多人接受答案了。
 
后退
顶部