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

本文介绍了在Delphi中使用ODAC连接Oracle数据库时,如何更新BLOB类型(用于存储图片)的数据。作者遇到EInternal ERROR问题,通过将更新语句放入存储过程解决了这个问题。详细步骤包括调用存储过程和存储过程的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我用的是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批评指正~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值