delphi中更新表字段update BLOB型数据(image)/获取图片转成BLOB型存入数据库

来源:互联网 发布:淘宝信用卡办理条件 编辑:程序博客网 时间:2024/05/12 05:05
我用的是ODAC 链接oracle数据库,delphi中update BLOB型数据问题困扰了我很久,我发现我直接

v_sql :='update xx_image set image:=in_image where xx1='+xx1;
                  with dm_db.OraQuery1 do
                  begin
                  Close;
                  Sql.clear;
                  Sql.Add(v_sql);

                  ParamByName('in_image').AsOraBlob.LoadFromFile(uri);//uri是图片地址

                  ExecSQL;
                  end;

这么写,会报EInternal ERROR,在网上搜了好多也没有合适的解决方法,最后向同事请教,将更新语句写到数据库的存储过程中,然后调用存储过程,这样不会报错了。

调用存储过程语句:

with dm_db.DzdaProc do begin
                                StoredProcName := 'UPDATE_XX_IMAGE';//存储过程名
                                PrepareSQL;
                                ParamByName('in_xx1').AsString := xx1;
                                ParamByName('in_xx2').AsString := copy(xx2,2,2);
                                ParamByName('in_xx3').AsString := xx3;
                                ParamByName('in_image').ParamType := ptInput;  // to transfer Lob data to Oracle
                                ParamByName('in_image').AsOraBlob.LoadFromFile(uri);  //uri是图片地址
                                Options.TemporaryLobUpdate := True;
                                Execute;
                                end;

存储过程代码(xx1,xx2,xx3代表数据库表的字段名称,xx_image是数据库表名):

CREATE OR REPLACE PROCEDURE UPDATE_XX_IMAGE
(in_xx1 IN varchar2,in_xx2 IN varchar2,in_xx3 IN Number,in_image IN BLOB)
IS
 lobloc blob;
 vLength integer;
BEGIN

 if(in_image is not null) then
  select image into lobloc from xx_image where xx1= in_xx1and xx2=in_xx2 and xx3=in_xx3 for update;
  vLength := dbms_lob.getLength(in_image);
  DBMS_LOB.open(lobloc,DBMS_LOB.lob_readwrite);
  DBMS_LOB.copy(lobloc,in_image,vLength);
  end if;
  commit;
  EXCEPTION
    WHEN OTHERS THEN
      ROLLBACK;
    
END;

欢迎各位程序yuan批评指正~