在三層中我怎么傳遞自定義的數據﹖(100分)

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

databox

Unregistered / Unconfirmed
GUEST, unregistred user!
大俠們﹕我剛學習三層﹐我的數據從應用程序服務器取得后﹐要經過修改﹐然后傳遞自定義
的數組類型到客戶端﹐然后客戶端還可以修改﹐修改后還要照著原樣還原﹐客戶端還要打印
報表﹐我想將報表寫在應用服務器中﹐因為報表格式有可能改變﹐若一改變﹐豈不要變更所
有客戶端﹖大俠們﹐請問怎么處理這件事情﹖而我在客戶端又怎樣調用應用服務器中的應用
法則﹖小弟初學﹐請教啦﹖
 
不必把报表等放在服务器客, 放在服务器端程序太复杂, 最好的办法是客户端程序自动
下载,当你程序更新时, 客户端自动下载。 做法如同OCX 一样。
 
即使不將報表放在服務層中﹐那我的企業法則怎么放呢﹖我要將數據傳給服務器用運算方法
修改﹐然后又傳回客戶端﹐而也許傳回客戶端的只是數組。那么﹐我要保存怎么辦﹖
 
参见以下程序:
Server(COM/DCOM程序)端:
procedure TTestDCOM.Send4(Size: Integer;
var D1: OleVariant);
begin

//此处赋值给D1;
end;

end;

Cleint端:
Var
D1:OleVariant;
begin

D1:=VarArrayCreate([0,99],varByte);
{
D1[1]:=45;
.... //将值存入D1中 }
S.appserver.Send4(99,D1);
//S是TestDCOM对象
end;

 
謝謝gh800﹐還有其他的嗎﹖
 
gh800:我照你的方法不行呢。你看我的例子﹕
服務器端﹕
procedure TShoesSystem.Test(var Size: OleVariant);
var i:integer;
begin
QryTemp.SQL.Clear;
QryTemp.SQL.Text:='select * from style where no=:styno and cus_no=:cusno';
QryTemp.Params[0].AsString:='667088';
QryTemp.Params[1].AsString:='AD';
QryTemp.Active:=True;
for i:=0 to 35do
begin
Size:=QryTemp.Fields[15+i].AsString;
end;
end;
客戶端﹕
procedure TForm2.Button1Click(Sender: TObject);
Var
D1:OleVariant;
i:integer;
ss:string;
begin
D1:=VarArrayCreate([0,36],varByte);
DMC.DM.DCOMCon.AppServer.Test(D1);//運行到這兒出錯﹕invaild variant type conversion
for i:=0 to 35do
ListBox1.Items.Add(D1);
end;
另外﹐里面的參數類型我怎么設呢﹖好像只能設成OleVariant,out參數設成什么long,float,istrings都不行。
哪位能講一下這些參數到底怎么用嗎﹖再回饋100分。
 
最近也在烦这个问题,在网上找到一段代码是Stream和OleVariant的转换。
这样可以不管是什么数据结构(包括文件),都可以转换成流,再转换成OleVariant
进行传递。不过在两端也需要知道数据结构组成,以便转换成Stream和从Stream中读出。
procedure VariantToStream(const Data: OleVariant;
Stream: TStream);
var
p: Pointer;
begin

p := VarArrayLock(Data);
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1);

finally
VarArrayUnlock(Data);
end;

end;

function StreamToVariant(Stream: TStream): OleVariant;
var
p: Pointer;
begin

Result := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(Result);
try
Stream.Position := 0;

Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Result);
end;

end;
 
我覺得這個不太好﹐我是希望知道各個參數類型的具體資料和怎么傳送。不過﹐GanQuan的
方法也不失為一個方法。
 
我试过接受WIDESTRING,iNTEGER,DOUBLE,olevariant
 
多人接受答案了。
 
后退
顶部