我快疯掉了,搞了一天了,一个非常简单的问题,看了很多相关资料,没一个成功过!(50分)

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

laibin

Unregistered / Unconfirmed
GUEST, unregistred user!
三层中,我在服务器写了个方法:
function TKLPOS.AddInformaiton(SClerkInfo: OleVariant): WideString;
我想在客户端的时候,把 NO,Name,Tel等封装成一个OleVariant变量,如 VInfo;
这样调用服务端的方法AddInformaiton(VInfo).
在服务端接到VInfo后,先把VInfo再转换回来,能得到 NO,Name,Tel等,接着再把这些值
插到数据库中,查询时也是这样,服务端取得数据后先封装,在客户端在分拆,这些该怎么
做呀,我在网上看了很多资料,我照着试了都没有成功,哪位大虾能详细的教我怎么做?
谢谢
 
服务端用一ClientDataSet1,
if not VarisNull(VInfo) then
begin
ClientDataSet1.data:=VInfo;
ClientDataSet1.First;
while not ClientDataSet1.Eofdo
begin
ClientDataSet1.FieldByname('NO').AsString;
ClientDataSet1.Next;
...
end;
end;
 
谢谢,这个方法我了解,我不想用这种方法,我想用封装参数的方法!
真的没有人帮我吗?我真的快封了,从昨天搞到现在还没有!
难道非得等到美国打完伊拉克才行吗?
[:(][:(][:(][:(][:(][:(][:(][:(]
 
function TKLPOS.AddInformaiton(SClerkInfo: TOleStream): WideString;
建一个TOleStream,然后用TREADER和TWRITER读写数据。
OS := TOleStream.Create(AStream);
try
Writer := TWriter.Create(os,1024);
try
writer.WriteInteger(High(YanxinArray));
//你传递的数据库记录的个数,我这里是个一般的数组
for i:=0 to High(YanxinArray)do
begin
//依次写入每个字段的值
writer.WriteInteger(YanxinArray.Number);
writer.WriteFloat (YanxinArray.Kaishi );
...............................
end;

READER就不用说了吧,先读个数,然后按写的顺序进行就可以了。
 
非常感谢,读我也不会,我在大富翁上查了60多页,可还是没能解决问题!
我只需要传一条记录,你能给我一个完整的例子吗?
谢谢!
 
OS := TOleStream.Create(stmInfo);
try
Reader := TReader.Create(OS, 1024);
try
geshu:= Reader.Readinteger;
for i:=0 to geshudo
begin
YanxinArray.Number:= Reader.Readinteger;
YanxinArray.Kaishi:= Reader.ReadFloat;
 
方法有兩種:
一.
(1):服務器端:
procedure TKLPOS.AddInformaiton(SClerkInfo: OleVariant);
var
No,Name,Tel:string;
begin
No:=SClerkInfo[0];
Name:=SClerkInfo[1];
Tel:=SClerkInfo[2];
end;
客戶端;
var
V:OleVariant;
begin
No:='123';
Name:='Lison';
Tel:='12345678';
V:=VarArrayOf(No,Name,Tel);
SocketConnection1.AppServer.AddInformaiton(V);
end;
二.
(1):服務器端:
type TInfo=record
No:string[10];
//長度要確定
Name:string[20];
//長度要確定
Tel:string[12];
//長度要確定
end;
procedure TKLPOS.AddInformaiton(SClerkInfo: OleVariant);
var
Info:TInfo;
P:Pointer;
No,Name,Tel:string;
begin
P:=VarArrayLock(SClerkInfo);
try
Move(P,Info,SizeOf(Info));
No:=Info.No;
Name:=Info.Name;
Tel:=Info.Tel;
finally
VarArrayUnLock(SClerkInfo);
end;
end;
客戶端;
type TInfo=record
No:string[10];
//長度要確定
Name:string[20];
//長度要確定
Tel:string[12];
//長度要確定
end;

var
V:OleVariant;
Info:TInfo;
P:Pointer;
begin
Info.No:='123';
Info.Name:='Lison';
Info.Tel:='12345678';
V:=VarArrayCreate([0,SizeOf(Info)-1],varByte);
P:=VarArrayLock(V);
try
Move(Inof,P,SizeOf(Info));
finally
VarArrayUnLock(V);
end;
SocketConnection1.AppServer.AddInformaiton(V);
end;

//若你是用的其中之一,那麼還出問題的話,可能是你的方法定義不正確了.
 
to wk_knife:
function TKLPOS.AddInformaiton(SClerkInfo: TOleStream): WideString;
中TOleStream怎么定义呀!
谢谢!
 
uses AxCtrls;
 
不一顶非要OLESTREAM。
一般的流也可以。
 
to smokingroom:
这段程序出错,好像是访问了非法内存,已注释掉条用服务器部分!怎么回事!
var
V:OleVariant;
Info:TInfo;
P:Pointer;
begin
Info.No:='123';
Info.Name:='Lison';
Info.Tel:='12345678';
V:=VarArrayCreate([0,SizeOf(Info)-1],varByte);
P:=VarArrayLock(V);
try
Move(Inof,P,SizeOf(Info));
finally
VarArrayUnLock(V);
end;
//SocketConnection1.AppServer.AddInformaiton(V);
to wk_knife:
我在类型库中定义的方法,他没有这各类型呀,要手动修改吗>?
 
那就用TStream
 
to smokingroom:
var
V:OleVariant;
begin
No:='123';
Name:='Lison';
Tel:='12345678';
V:=VarArrayOf(No,Name,Tel);
提示,类型不兼容,Array and String.其中我把NO,Name等定义成String型,那要定义成什么型!
非常感谢两位的回答,问题解决我会另开贴给你们分的!
 
Move(Inof,P,SizeOf(Info)) 改為 Move(Info,P^,SizeOf(Info));
Sorry,沒注意.
好像還有一個Move,也是一樣.應該為P^
 
>>我想在客户端的时候,把 NO,Name,Tel等封装成一个OleVariant变量,如 VInfo;
>>这样调用服务端的方法AddInformaiton(VInfo).
>>在服务端接到VInfo后,先把VInfo再转换回来,能得到 NO,Name,Tel等
你的描述很正确。
你可以在客户端和服务器中间传递 OleVariant类型的数组。
客户端将一条记录的每一个字段存储到OleVariant类型的数组中,然后调用服务端的方法。
服务端接受OleVariant类型的数组,然后一一对应保存到数据库即可。
 
to wk_knife:
也没有Tstream这种类型呀!
我是初学者,不好意思,麻烦你们了!
 
V:=VarArrayOf(No,Name,Tel);應該改為VarArrayOf([No,Name,Tel]);
嘿嘿,直接寫的,沒有測試,忘了細節.抱歉!
 
to jrq:
你说的很对,可我就是不知道怎么实现呀!
我试了很多方法,都没有成功,如果你做过,能麻烦你一下吗?
给我给具体的例子,详细点!
 
用TstringList也可以
 
祝你好運!再試試我的方法,絕對是行得通的.
 
后退
顶部