三层中的应用程序层关于返回多值问题,没人回答吗。 (50分)

  • 主题发起人 主题发起人 liujunzhang
  • 开始时间 开始时间
L

liujunzhang

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:你们好!祝各位工作顺利!
我要问的问题是:在三层中的应用层如何实现返回多个值。
例如:
SqlText:为SQL语句。
function TGoodses.GetNeedValue(const SqlText: WideString): oleVariant;
Var
NeedValue:TStrings;
I:Integer;
begin
NeedValue:=TStringList.Create;
With Adoquery1do
begin
CLose;
Sql.Clear;
Sql.Add(SqlText);
Open;
For I:=0 To RecordCount-1do
begin
NeedValue:=Parameters[0].Value;
Next;
end;
end;
Result:=NeedValue;
end;
这是应用服务器的,我要在客户端调用。
但是我不知道应用服务器如何返回多值。请教。
顺问Variant和OLEVariant 之间有什么区别“

 
可以用VARIANT类型呀,
 
客户端也用个oleVariant就行了
 
返回多个值,用oleVariant数组。
 
请问Variant和OLeVariant有什么区别?
 
改一下:
function TGoodses.GetNeedValue(var SqlText:array of variant): oleVariant;
 
应该说用不着:
function TGoodses.GetNeedValue(var SqlText:array of variant): oleVariant
你可以试试
X : oleVariant;
y : TStrings;
……
TRY
X:=GetNeedValue(SqlText);
if (X is TStrings) then
Y:= X As TStrings
EXCEPT
……
 
给您一段代码
MyRobin:=VarArrayCreate([0,3],VarVariant);
if not DatabaseMaterial.Connected then
DatabaseMaterial.Connected:=True;
try
with QueryMyTempQuerydo
begin
Close;
UnPrePare;
SQL.Clear;
SQL.Add(MySQLStr);
PrePare;
Open;
end;
它能返回多个值。用变体数组。
 
很容易啊,你在设置函数变量的时候使用Out参数修饰就行了,
你在定义接口的时候,函数返回值是用[out,retval]修饰的,
如果除了函数的返回值外,还想返回其它值,
那么你可以去掉retval,只保留[out]修饰你的变量。
这样你定义几个out修饰的变量,就有几个可用的返回值了。
当然这些变量都是指针型的。
 
你可以在返回值的时候用
Result := VarArrayOf([......]);
省略号的部分就是你要返回的各个值,
在客户端接收的时候,先用一个Variant把返回值接过来,然后在把这个Variant拆开
例如:
BackValue := 中间层函数;
i1 := BackValue[0];
s1 := BackValue[1];
......
其中的i1,s1就是从中间层返回的值
 
答案自己解决。
 
请问Variant和OLEVariant有什么区别??
 
返回多个值只要将fuction改成带多个var的procedure就可以了。
 
关于Variant和OleVaraint的区别,在Delphi的帮助中这样子写道:
The OleVariant type exists on both the Windows and Linux platforms.
The main difference between Variant and OleVariant is that
Variant can contain data types that only the current application knows
what todo
with.
OleVariant can only contain the data types defined as compatible
with Ole Automation which means that the data types
that can be passed between programs or across the network
without worrying about whether the other end will know how to handle the data.
从上面的英文解释中可以看出OleVaraint用于Ole Automation情况下面,而Variant用于一个
程序的内部.
 
我给您了一段程序。就是这样解决的呀?您按我的做个例子不就出来了吗?
procedure TFLAGSYSTEM.FindSmallcodeValue(var MyRobinA,
MyRobinB: OleVariant);
var
MySQLStr:String;
begin
MySQLStr:='Select * from KIND_SMALL Where BIGCODE='#39+MyRobinA[0]+#39''+
' and MIDDLECODE='''+MyRobinA[1]+''' and SMALLCODE='''+MyRobinA[2]+''''+
' ORDER BY SMALLCODE ASC';
MyRobinB:=VarArrayCreate([0,4],VarVariant);
if not DatabaseMaterial.Connected then
DatabaseMaterial.Connected:=True;
try
with QueryTreeViewListdo
begin
Close;
UnPrePare;
SQL.Clear;
SQL.Add(MySQLStr);
PrePare;
Open;
end;
MyRobinB[0]:=QueryTreeViewList.FieldByName('BIGCODE').AsString;
MyRobinB[1]:=QueryTreeViewList.FieldByName('MIDDLECODE').AsString;
MyRobinB[2]:=QueryTreeViewList.FieldByName('SMALLCODE').AsString;
MyRobinB[3]:=QueryTreeViewList.FieldByName('SMALLNAME').AsString;
MyRobinB[4]:=QueryTreeViewList.FieldByName('MEMO').AsString;
except
Abort;
end;
end;
 
我的想法很简单:用分隔符把 NeedValue数组变成字符串,在客户端再分解。
 
多人接受答案了。
 
后退
顶部