急!三层传递图片(在线等候)(100分)

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

dzx2004

Unregistered / Unconfirmed
GUEST, unregistred user!
三层结构中,如何把客户端中添加的资料保存到远程的数据库中,我想采用这种方法:把客户端中的每个字段数据都传递到中间的应用层,再在中间层编写代码添加到数据库中,但有些如图片怎样传递,小弟我刚开始三层的学习,我这种方法是否可取,有更好的方法吗?望各位大侠不啬赐教!
 
怎么没人应呢?各位大虾帮帮忙!
 
学习中。。。
 
高手呢?
 
要传图片数据到中间层,可以把图片转化为流,再把流写到一个varByte类型的数组中,把这个数组传至中间层,然后再反方向转化回来的。
 
to dzx2004:
就象楼上说的,传图片就是传文件,传文件就是传比特流。
 
To dedema:
我也朝这方面想过,但不知何从下手,能否提供一些参考性质的代码,不胜感激。
 
对,就是存储流,读取流。
TBlobField(ADOQuery1.FieldByName('??')).SaveToStream(stream);
TBlobField(ADOQuery1.FieldByName('??')).LoadFromStream(stream);
 
我也遇到类似的问题,但不知道你是否做了一个一般的三层,是的话可用Olevariant传递,用Tclientdataset识别内容.我的问题是,如果客户端不能使用Tclientdataset构件,如何象dedema说的传递byte类型的数组,因为在中间层建立的接口方法中,只有byte类型可以传递,请指教
 
呵呵, 这个简单 在客户端:用下面这个函数
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;

在 中间层用
/
procedure VariantToStream(const Data: OleVariant;Stream:TMemoryStream);
var
p: Pointer;
begin
p := VarArrayLock(Data);
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1);
finally
VarArrayUnlock(Data);
end;
end;

然后不用我说了吧

给分 这个问题才 100 分啊 唉
 
To chshanghai
我刚开始学习三层,我现在是遇到的是把图片是传输数据中的一个字段,难道要把图片的字段另外传输,在中间层再合并存入数据库吗?有好的方法只在一个函数中实现吗?非常感谢!
 
仅供参考:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2117291
在D6+Access2K中测试通过:
服务端方法如下:
procedure TTestDM.Insert_Img(var Pic: OleVariant);
var P : Pointer;
FileStream:TMemoryStream;
begin
FileStream:=TMemoryStream.Create;
//生成内存流
try
FileStream.Size := VarArrayHighBound(Pic, 1) - VarArrayLowBound(Pic, 1) + 1;
P := VarArrayLock(Pic);
FileStream.Position := 0;
FileStream.Write(P^, fileStream.Size);
//保存到流中
VarArrayUnlock (Pic);
FileStream.Position := 0;
with ADOQuery1do
begin
Close;
SQL.Clear;
SQL.Add(' insert into test(Img) values(:Img_Test)');
Parameters.ParamByName('Img_Test').LoadFromStream(FileStream,ftVarBytes);
//从流中写入数据库
ExecSQL;
end;
finally
FreeAndNil(FileStream);
end;
end;

客户端调用如下:
var FileStream:TMemoryStream;
Pic: OleVariant;
P : Pointer;
begin
FileStream:=TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(FileStream);//图片保存到内存流
try
Pic := VarArrayCreate ([0, FileStream.Size - 1], varByte);
P := VarArrayLock (Pic);
FileStream.Position := 0;
FileStream.Read (P^, FileStream.Size);
//保存为 OleVariant
VarArrayUnlock (Pic);
try
SocketConnection1.AppServer.Insert_Img(Pic);
//调用服务器的方法
except
Application.MessageBox('保存出错啦! ','提示信息',MB_OK+MB_ICONINFORMATION);
end;
finally
FreeAndNil(fileStream);
end;
end;
 
jry说的没错,给分吧,我的问题也解决了,多谢了
 
后退
顶部