帮忙解答,急死了,这么用adostoreprecedure存取image字段?????
 with PacsDataMO.adspPACS do
  begin
    if Active then close;
    ProcedureName := 'SP_DIA_UPDATE_IMG_HZX';//HZX
    Parameters.Clear;
    Parameters.CreateParameter('NODE_ID',ftinteger,pdInput,20,NodeID);         Parameters.CreateParameter('NODE_IMG',ftBlob,pdInput,65535,Image1.Picture.Bitmap);
这里的长度我不知道这么设置,而且Image1.Picture.Bitmap也报错,通不过,
只能用这种带参数的adosp,不好办阿.
    Parameters.CreateParameter('NODE_NAME',ftstring,pdInput,20,'');
    Parameters.CreateParameter('ACTION',ftinteger,pdInput,20,2);
    Parameters.CreateParameter('OP_TAG',ftinteger,pdInput,20,OP_TAG);
-------------
'SP_DIA_UPDATE_IMG_HZX'如下
CREATE PROCEDURE SP_DIA_UPDATE_IMG_HZX 
@NODE_ID INT,@NODE_IMG  image,@NODE_NAME NVARCHAR(100) ='',@ACTION int,
@OP_TAG int
AS
if @OP_TAG = 1
begin
  IF @ACTION = 1 
    UPDATE BCZSK.dbo.个人资料库 SET 结点名称 = Rtrim(Ltrim(@NODE_NAME)) WHERE 结点标识 =@NODE_ID
  ELSE IF @ACTION =2
    UPDATE BCZSK.dbo.个人资料库 SET 照片 =@NODE_IMG WHERE 结点标识 =@NODE_ID
  return
end
GO

解决方案 »

  1.   

    直接以 Image1.Picture.Bitmap 作为参数,即使编译通过了, 存储过程的到的数据也是错误的,因为其实际是个对象, 而不是简单的数据。你可以用下面的这个函数将图象数据写入到ole对象中, 其返回的是长度
    function BitmapToOLE( var img :TImage;; var ole:OLEVariant ):Integer;
    var i:integer;
        stm:TStream;
        p:pchar;
    begin
      stm := TStream.Create;
      try
        img.Picture.Bitmap.SaveToStream( stm );
        stm.Postion := 0;
      
        i := stm.Size;
        ole := vararrayCreate([0,i-1],varbyte);
        p := vararrayLock( ole );
        stm.Position := 0;
        stm.Read(p^, i);
        vararrayunlock(ole);    Result := stm.Size;
      finally
        stm.Free;
      end;
    end;调用方法如下:
    var ole:OLEVariant;
        iSize :Integer;
    ....
    begin
      ...
      iSize := BitmapToOLE( Image1, ole );  ...  Parameters.CreateParameter( 'NODE_IMG', ftBlob, pdInput, iSize, ole );当然最后最好要把ole 占用的空间给释放掉。