最近很少写技术贴,前几天协助王锋师兄解决了在delphi7中,使用ODAC组件存取图片的问题。事后,他整理了一个经验文档,争得他同意,我贴出来,以备以后查询之用。
说明:ODAC组件我不熟悉,在使用它存取图片的时候,特别注意sql的写法。
ODAC 组件支持 Oracle8 的 BLOB 和 CLOB 数据类型。你可以使用 TOraQuery 组件来获取 LOB 字段的值,BLOB 和 CLOB 数据类型通过 LOB 定位器(指定数据地址) 存储在表列中;实际的 BLOB 和 CLOB 数据存储在独立的表空间中。当存取 LOB 列时,返回的是定位器。要初始化 LOB 定位器,你必须使用 EMPTY_BLOB 或 EMPTY_CLOB Oracle 函数。要返回初始化后的定位器,应在同样的语句中使用 RETURNING 子句。ODAC 写 LOB 数据到 Oracle 且返回初始值字段,需使用:值参数. 对 ODAC 来说,在 LOB 操作中使用 ParamType 属性是非常重要的。如果 ParamType 是 ptInput , ODAC 写数据到服务器,如果 ParamType 是 ptOutput,它则读取数据。
以下两个例子是从Oracle10g中存/取jpg和bmp图片,需要注意的是在存图片的时候SQL语句的写法。
(1)存图片
procedure TNewStamp.BitBtn3Click(Sender: TObject);
var
pic:TMemoryStream;
pjpg:tjpegimage;
pjpeg:tjpegimage;
bmp:tbitmap;
begin
{ //jpg图片
pjpeg:=tjpegimage.Create;
pjpg:=tjpegimage.Create;
pjpg.LoadFromFile(‘C:\1112.jpg’);
pic:=TMemoryStream.Create;
pjpg.SaveToStream(pic);
pic.Position:=0;
pjpeg.LoadFromStream(pic);
image1.Picture.Assign(pjpeg);
login.SmartQuery1.Close;
login.SmartQuery1.SQL.Clear;
login.SmartQuery1.SQL.Add(‘insert into TEST(TEST1,TEST2) VALUES(:t1,EMPTY_BLOB()) returning TEST2 into :TEST2′);
login.SmartQuery1.ParamByName(‘t1′).AsString:=’123′;
login.SmartQuery1.ParamByName(‘TEST2′).ParamType:=ptInput;
login.SmartQuery1.ParamByName(‘TEST2′).AsOraBlob.LoadFromStream(pic);
login.SmartQuery1.Prepare;
login.SmartQuery1.ExecSQL;
}
//bmp图片
bmp:=tbitmap.Create;
pic:=TMemoryStream.Create;
bmp.LoadFromFile(‘C:\122.bmp’);
bmp.SaveToStream(pic);
pic.Position:=0;
login.SmartQuery1.Close;
login.SmartQuery1.SQL.Clear;
login.SmartQuery1.SQL.Add(‘insert into TEST(TEST1,TEST2) VALUES(:t1,EMPTY_BLOB()) returning TEST2 into :TEST2′);
login.SmartQuery1.ParamByName(‘t1′).AsString:=’124′;
login.SmartQuery1.ParamByName(‘TEST2′).ParamType:=ptInput;
login.SmartQuery1.ParamByName(‘TEST2′).AsOraBlob.LoadFromStream(pic);
login.SmartQuery1.Prepare;
login.SmartQuery1.ExecSQL;
end;
(2)取图片
procedure TNewStamp.BitBtn2Click(Sender: TObject);
var
pic:TMemoryStream;
pjpeg:tjpegimage; //jpg格式图片
bmp:tbitmap; //bmp格式图片
begin
login.OraQuery1.SQL.Clear;
login.OraQuery1.SQL.Add(‘select * from TEST ‘);
login.OraQuery1.AutoCommit := false;
login.OraQuery1.FetchAll := true;
login.OraQuery1.Open;
if login.OraQuery1.RecordCount = 0 then
begin
showmessage(‘没有记录’);
exit;
end;
bmp:=tbitmap.Create;
pjpeg:=tjpegimage.Create;
pic:=TMemoryStream.Create;
TBlobField(login.OraQuery1.fieldbyname(‘TEST2′)).savetostream(pic);
pic.Position:=0;
bmp.LoadFromStream(pic);
bmp.SaveToFile(‘C:\122.bmp’);
image1.Picture.Assign(bmp);
pic.Free;
end;

你好!
用你发布的代码
可以往Oracle9i中存bmp格式的图片
但往Oracle10g中存图片时报错
不知这是什么原因???