本人要写一个组件,用于ASP调用的。其中有一个是从远端服务器数据库读取图片到本地后,将其替换至WORD文档。
由于我用ADO进行远程连接并应用于ACTIVCEX所以只能用这种动态创建较好。
可这种创建与ASP中的类似了,那我如何将读出来的二进制文件写入TmemoryStream
呢?
procedure TdocCreateActiveX.Read_Photo(intI: Integer);
var
   rs:OleVariant;
   mem_stream:TMemoryStream;
   Image:TImage;
   strField,strWord:string;
begin
    Image:= TImage.Create(nil);    rs := createOleobject('ADODB.recordset'); // ' + FareaCode + '
    rs.ActiveConnection := Query;
    try
    rs.Open(FSqlStrImg, query, 3, 1);
    except
      showmessage('rs.open 出错');
    end;
    if not rs.Eof then
    begin
          try
             strField:=trim(rs.fields[intI].name);
             (rs.fields[strField].value as TBlobField).SaveToStream(mem_stream);//这里出错了,因为它不支持 TBlobField类型转换的。
             //strWord:= JudgeStr(strWord);
             //ReplaceWord(strField,strWord);}          except
             ShowMessage('数据输出出错,请重试!');
             exitWord;
          end;
    end;
    rs.close;
end;

解决方案 »

  1.   


    我将图片存下来了,用如下代码,可是图片大小对,但是图片却不能显示。
    query := CreateOleObject('ADODB.connection');
        cs := 'provider=ASAprov;eng=''lyj_eatery'';uid=''lyj'';pwd=''LYJFDCPDXTSXGS'';commlinks=tcpip(host=''192.168.10.80'')';
        try
           query.OPen(cs);
        except
           MessageBox(0,'连接远程数据库出错,请得试!','系统提示',MB_OK+MB_ICONERROR);
           Exit;
        end;
        strSQL:='select * from eatery_photo where e_code=''11010000000001''';
        rs := createOleobject('ADODB.recordset'); // ' + FareaCode + '
        rs.ActiveConnection := Query;
        try
        rs.Open(strSQL, query, 3, 1);
        except
          showmessage('rs.open 出错');
        end;
        if not rs.Eof then
        begin
              try
                 strField:=trim(rs.fields[1].name);
                 vImgTemp:= rs.fields[strField].value;
                 mem_stream:= TMemoryStream.Create;
                 mem_stream.WriteBuffer(vImgTemp,sizeof(vImgTemp));
                 showmessage(inttostr(sizeof(vImgTemp)));             if FileExists('c:\out_image_temp.jpg') then deletefile('c:\out_image_temp.jpg');
                 mem_stream.SaveToFile('c:\out_image_temp.jpg');
                 mem_stream.Free;
                 //strWord:= JudgeStr(strWord);
                 //ReplaceWord(strField,strWord);}
              except
                 ShowMessage('数据输出出错,请重试!');
              end;
        end;
        rs.close;
        query.close;
      

  2.   

    (rs.fields[strField].value as TBlobField).SaveToStream(mem_stream);//这里出错了,因为它不支持 TBlobField类型转换的。
    改为:
    TBlobField(rs.Fields[strField]).SavetoStream(Mem_Stream);
    试试!
      

  3.   

    还有,你的图片格式如果是jpg格式的,要连到TjpegImage上,然后再用jpgimage的SaveToFile存文件!
      

  4.   

    大哥,我试过了,不可以的。这样不用JPEG类时也是可以的。但我必须用上面的方法
    var
      mem_stream:TMemoryStream;
      selfquery:TADOQuery;
    begin
      try
        mem_stream:=TMemoryStream.Create;
        selfquery:=TADOQuery.Create(nil);
        with selfquery do begin
          Connection:=ADOConnection1;
          if Active then close;
          SQL.Clear;
          SQL.Add('select * from eatery_photo where e_code=''11010000000003''');
          Open;
          (selfquery.FieldByName('e_photo') as TBlobField).SaveToStream(mem_stream)  ;
          if FileExists('c:\out_image_temp.jpg') then deletefile('c:\out_image_temp.jpg');
          mem_stream.SaveToFile('c:\out_image_temp.jpg');    end
      except
        Application.MessageBox('照片装载时发生错误,请重新操作!','系统提示',MB_OK+MB_ICONINFORMATION);
        //mem_stream.Free;
        //selfquery.Close;
        exit;
      end;
      mem_stream.Free;
      selfquery.Close;
    end;
      

  5.   

    唉,不对呀,真的没有办法了吗?我用上面第二种方法,也就是用TBLOBFIELD是可以读出图片的,图片完全正常,我是我用第一种方法给variant时值就不对了,传不到variant。
    大家可以用上面几种形式试一下。