Blob参数在多层中如何传递?(73分)

  • 主题发起人 arong2008
  • 开始时间
A

arong2008

Unregistered / Unconfirmed
GUEST, unregistred user!
ADO+SQL Server 2K+Delphi 5+miads做的三层结构.
中间层RDM自定了一个接口,有一个参数为olevariant类型,把数据库中的image类型的数据
传给Client,想通TMemoryStream把数据读到olevariant中,失败.
问题1:如何把一个TMemoryStream中的数据读到一个olevariant型变量中?
问题2:如上面描述,有否其他方法实现?如何做?
(73分全部献上)
 
问题1:
fcontent:eek:levariant;
p:pointer;
stream:tmemorystream;
begin
......
fcontent:=VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(fcontent);
try
Stream.Position := 0;
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(fcontent);
end;
....

客户端
....
问题2:image类型的数据据我所知只有有这一种方法、
我可是现给你做出来的噢。:)
 
先谢谢晴,幸苦了.
不过传到客户端后,用类似的方式从传回的oleVariant变量写进流里面,在中间层可以,但在客户端不行,望赐教.
 
我没有明白你的意思,什么在中间层可以,在客户端不行?
从数据库中读Blob到客户端是可以的。
我试过了。
 
可能是我没说清楚.
在中间层执行的代码用ADO连到数据库,取得BLOB数据到Stream中,还是在中间层的代码,按
你说方法做,可以把Stream数据读到oleVariant型参数中,也可以又从oleVariant型变量写到
Stream中,但是当oleVariant型参数传到客户端时,在客户端的代码执行把数据从oleVariant型
变量读到Stream中时,会失败.
 
不会吧。我就是这样试验的,没错。
我把原码给你,你参考一下。
1。应用服务器:
procedure Tywh.SqlTest(var filename: WideString;
out fcontent: OleVariant);
var str:string;
Stream:TMemoryStream;
P:pointer;
begin
Str:='SELECT filename, fcontent FROM filetable';
if query_tmp.Active then
query_tmp.Close;
query_tmp.SQL.Clear;
query_tmp.SQL.Add(str);
try
query_tmp.Open;
if not query_tmp.Eof then
begin
while not query_tmp.Eofdo
begin
if not query_tmp.FieldByName('fcontent').IsNull then
begin
//stream转换为OleVariant
stream:=TMemoryStream.Create;
FileName:=query_tmp.Fields[0].AsString;
TBlobField(query_tmp.FieldByName('fcontent')).SaveToStream(stream);
fcontent:=VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(fcontent);
try
Stream.Position := 0;
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(fcontent);
end;
break;
end
else
query_tmp.Next;
end;
end;
except on e:exceptiondo
FileName:=e.Message;
end;
end;

2.客户端:
procedure TForm1.Button1Click(Sender: TObject);
var filename:string;
fcontent:OleVariant;
fstream:tmemorystream;
p : Pointer;
tmpf:textfile;
i:integer;
j:tjpegimage;
begin
if not SocketConnection1.Connected then
SocketConnection1.Open;
try
SocketConnection1.AppServer.Sqltest(filename,fcontent);
//OleVariant转换为stream,并把值传递给stream
fstream:=tmemorystream.Create;
//j:=tjpegimage.Create;
fStream.Position := 0;
i:=sizeof(fcontent);
fstream.Size:= VarArrayHighBound(fcontent,1)-VarArrayLowBound(fcontent,1)+1;
p := VarArrayLock(fcontent);
fStream.Write (p^, fStream.Size);
VarArrayUnlock (fcontent);
fstream.LoadFromStream(fStream);
fstream.SaveToFile('e:/kkk.txt');
//j.LoadFromStream(fstream);
//image.Picture.assign(j);
except on e:exceptiondo
showmessage(e.Message);
end;
end;
这回应该不会再有错了吧
 
看看下帖的跟贴,可能对你有帮助,我先把任何类型先转成TByteArray,然后再转成OleVariant
给大家一个好东东:Using COM to Transfer Any Type of Data
 
多谢!
原来是客户端没有调用构造函数.
学Delphi都已经第五个月,连这么低级的错误都会犯,见笑了.
 
多人接受答案了。
 
顶部