我用的是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批评指正~
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批评指正~