Blob参数在多层中如何传递?

ADO+SQL Server 2K+Delphi 5+miads做的三层结构.
中间层RDM自定了一个接口,有一个参数为olevariant类型,把数据库中的image类型的数据
传给Client,想通TMemoryStream把数据读到olevariant中,失败.
问题1:如何把一个TMemoryStream中的数据读到一个olevariant型变量中?
问题2:如上面描述,有否其他方法实现?如何做?


问题1:
  fcontent:olevariant;
  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类型的数据据我所知只有有这一种方法、
我可是现给你做出来的噢。:) 


不会吧。我就是这样试验的,没错。
我把原码给你,你参考一下。
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.Eof do
      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:exception do
    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:exception do
   showmessage(e.Message);
   end;
end;
这回应该不会再有错了吧 

posted @ 2010-11-26 00:34  覆雨翻云  阅读(536)  评论(0编辑  收藏  举报