如何通过一方法返回一个记录类型的数据(该记录中又有记录类型的字段)?(100分)

  • 主题发起人 主题发起人 zengtao
  • 开始时间 开始时间
Z

zengtao

Unregistered / Unconfirmed
GUEST, unregistred user!
例:
myRec=record
name:string;
Age:int;
Sex:Boolean;
resume:array of resumeRec;
end;
然后我想通过一个方法根据传入Name值从数据库中取出信息回传给客户端,请问我应该怎样做呢?
 
不明白你的意思,是想用数据表保存你的record?
 
明白
function getrecord(const AName: String): MyRec;
var
sql: String;
begin
SQL:='select * from xxx where name='+QuotedStr(name);
adoquery1.close;adoquery1.sql.clear;
adoquery1.sql.add(sql);adoquery1.open;
if adoquery1.recordcount>0 then
begin
Result.name=adoquery1.fieldbyname('name').asstring;
....
end;
end;
 
我指的是在三层应用中,客户层通过访问应用层想取得的结果?
 
你做过三层没?
把这个函数放在中间层不就行啦。
 
var
TrxDM: ITollTrxDM;
Server: string;
Options: TGetRecordOptions;
RecsOut: Integer;
Params: OleVariant;
OwnerData: OleVariant;
begin
if not CheckSID(SID) then
Exit;
Options := [grMetaData, grReset];
Server := reg.GetProviderServer;
try
if Server = '' then
TrxDM := CoTollTrxDM.Create
else
TrxDM := CoTollTrxDM.CreateRemote(Server);
OwnerData := VarArrayOf([FVTypeID, FVID1, FVID2]);
Data := TrxDM.AS_GetRecords('dspTollOfFinance', -1, RecsOut,
Byte(Options), '', Params, OwnerData);
SetComplete;
Result := True;
except
SetAbort;
raise;
end;
end;
 
对不起我还是没有弄懂。
我说更详细一点吧?
我现在将以前的C/S(两层)的数据模块移置到三层的中间层去,我不想修改以前的函数,
只想把以前数据模块中的函数放在中间层的方法中调用并返回给客户端。
如:function mydatamodule.getPaperInfoFromDatabaseByPaperID(getPaperID: String): PaperInfo;
begin
end;
我想声明一个接口函数并在函数中调用上面的函数,并将结果传回到客户端去?
 
to xzh2000 :
function getrecord(const AName: String): MyRec;中的MYRec类型可以直接引用吗?
好象系统自带的类型中没有自定义的数据类型吧?问题:如何把记录类型Myrec可以用
来发布,否则只能是:function getrecord(const AName: String): Olevariant吧
 
function getrecord(const AName: String): Olevariant
关键在于Olevariant与MyRec之间的转换问题?这两种数据类型之间怎样转换?
 
如下轉換:
function GetRecord(const AName:String):OleVariant;
var
R:TMyRec;
V:OleVariant;
I:Integer;
begin
.....
....
V:=VarArrayCreate([0,Length(R.Resume)-1],VarVariant);
for I:=0 to Length(R.Resume)-1do
V:=VarArrayOf([R.Resume.ID,R.Resume.Name,R.Resume.XXX...);

Result:=VarArrayCreate([0,3],VarVariant);

Result[0]:=R.Name;
Result[1]:=R.Age;
Result[2]:=R.Sex;
Result[3]:=V;
end;
 
转换当然可以同smokingroom, 问题是在客户端来调用TMyRec的记录集呢?
 
如果我的记录类型是这样的呢?
myRec=record
name:string;
Age:int;
Sex:Boolean;
resume:array of resumeRec;
end;
resumeRec=record
WorkTime;Datetime;
Dept:string;
Memo:String;
end;
谢谢!!
 
TMemoryStream数据类型怎转换成OleVariant?
 
procedure TForm2.VariantToStream (const v : olevariant;
Stream : TMemoryStream);
var
p : pointer;
begin

Stream.Position := 0;
Stream.Size := VarArrayHighBound (v, 1) - VarArrayLowBound(v, 1) + 1;
p := VarArrayLock (v);
Stream.Write (p^, Stream.Size);
VarArrayUnlock (v);
Stream.Position := 0;
end;

procedure TForm2.StreamToVariant (Stream : TMemoryStream;
var v : OleVariant);
var
p : pointer;
begin

v := VarArrayCreate ([0, Stream.Size - 1], varByte);
p := VarArrayLock (v);
Stream.Position := 0;
Stream.Read (p^, Stream.Size);
VarArrayUnlock (v);
end;

 
多人接受答案了。
 
后退
顶部