首页 | 考研 | MBA | 专升本 | 成考 | 自考 | 高考 | 中考 | 出国 | 外语 | 电脑 | 公务员 | 司法 | 财考 | 资格考试 | 论文写作
 
 淘学考试计算机正文

 

在Oracle中创建和维护图形大对象
编辑:sunl 时间:2007-11-27 来源:淘学考试网 推荐好友

 

  在Oracle中使用大对象的方法:

  目的:把一个jpeg图像装入Oracle,并且用C++Builder显示出来。如果使用bmp图像,处理的过程则会更简单一些。

  1. 创建一个表picture

例子: 
  
   create table picture
   ( 
   picture_name varchar2(30), 
   picture_blob blob, 
   picture_locator bfile 
   );

  2. 创建一个目录,需要有DBA权限,用于指向在操作系统中的某个目录。

create directory picture_dir as 'd:\blob_test'

  ;假设在d:\blob_test目录下存放有pic.jpg、pic.bmp、pic.doc等文件。

  3. 插入一条记录,注意blob对象需要初始化为空对象,对于Blob类型的大对象必须用Empty_blob()函数。

insert into picture (picture_name,picture_blob,picture_locator ) 
values( 
'pic1',empty_blob(),bfilename('PICTURE_DIR','PIC.JPG'));

  4. 将picture_locator所指向的图形文件导入数据库的picture表中:

declare 
   l_pic_locator bfile; 
   l_pic_blob blob; 
   l_dir varchar2(200); 
   l_filename varchar2(200); 
   BEGIN 
select picture_locator,picture_blob into l_pic_locator,
l_pic_blob from picture where name='pic1';

 -- 1。判断文件是否存在 
   IF DBMS_LOB.FILEEXISTS(l_pic_locator)=1 then 
   dbms_output.put_line('!!! The file exists!'); 
   -- 2. 判断文件是否已被打开 
   if dbms_lob.fileisopen(l_pic_locator)=0 THEN 
   DBMS_OUTPUT.PUT_LINE
(' THE FILE IS NOT OPEN, TO OPEN THE FILE...'); 
   -- 3. 打开文件 
   DBMS_LOB.FILEOPEN(l_pic_locator); 
   DBMS_OUTPUT.PUT_LINE('!!! THE FILE IS OPENED!'); 
   
   -- 4. 可以获得关于文件的一些信息,比如文件名,大小等 
   dbms_output.put_line('The Length of the file is:'
||to_char(dbms_lob.getlength(l_pic_locator))); 
   dbms_lob.filegetname(l_pic_locator,l_dir,l_filename); 
   DBMS_OUTPUT.PUT_LINE('The opened file name is :
'||l_dir||'\'||l_filename); 
   -- 5. 将外部jpeg文件装入Blob字段 
   DBMS_LOB.LOADFROMFILE(l_pic_blob,
l_pic_locator,dbms_lob.getlength(l_pic_locator),1,1); 
   dbms_output.put_line('The file is loaded into database!'); 
   
   END IF; 
   DBMS_OUTPUT.PUT_LINE('To close the file'); 
   --6. 每一个fileopen必须有一个fileclose与之对应,所以关闭文件 
   IF DBMS_LOB.FILEISOPEN(l_pic_locator)=1 THEN 
   DBMS_LOB.FILECLOSE(l_pic_locator); 
   DBMS_OUTPUT.PUT_LINE('The file is closed!'); 
   END IF; 
   
   END IF; 
   -- 7. 还必须在exception中保证文件关闭文件 
   exception 
   when others then 
   IF DBMS_LOB.FILEISOPEN(L_PIC)=1 THEN 
   DBMS_LOB.FILECLOSE(L_PIC); 
   DBMS_OUTPUT.PUT_LINE
('An exception happens,the file is closed!'); 
   else 
   dbms_output.put_line('An exception happens!') ; 
   end if; 
   
   END; 
   
   --
   --在C++Builder中使用从数据库中取得
刚才创建的数据库中的图像
-----
   
   void __fastcall TForm1::Button1Click(TObject *Sender) 
   { 
   
   ADOQuery1- >Close(); 
   ADOQuery1- >SQL->Clear(); 
   ADOQuery1- >SQL->Add(Memo1->Lines->Text); 
   ADOQuery1- >Open(); 
   
   if (ADOQuery1- >FieldByName("name")->AsString=="pic1") 
   DBImage1- >DataField="PICTURE_BLOB"; 
   else 
   {//1.创建用于存放Blob大对象的临时字段,
并初始化为从数据库中取得的图形 
   TBlobField *pField =
(TBlobField *)ADOQuery1->FieldByName("picture_blob"); 
   
   //2.创建一个BlobStream流,以流的形式读取图形数据 
   TADOBlobStream *pmem = new TADOBlobStream(pField,bmRead); 
   
   //3. 将流指针放在流的头部 
   pmem- >Seek(0,soFromBeginning); 
   
   //4. 新建一个JPEG对象 
   TJPEGImage * jp = new TJPEGImage(); 
   
   //5. 将放在BlobStream流中的图形信息读入jpeg对象 
   jp- >LoadFromStream(pmem); 
   
   //6. 将jpeg图像放在Image控件的picture组件的Graphic内,
显示出来Image1->Picture->Graphic=jp; 
   
   //7. 释放BlobStream流 
   
   delete pmem; 
   
   } 
   
   }

  

 

 

 

 

 

 

 

 

 

 

 相 关 内 容



.

  推荐课程
 
 
 
 
 
 
 最近更新
 综合辅导
 经验技巧
版权信息 - 关于我们 - 联系方式 - 服务承诺 - 客户投诉 - 广告服务 - 网站合作 - 会员服务 - 友情链接 - 站长统计3
1 不良信息
举报中心
文明办网文明上网举报电话:15964542668
举报邮箱:topej@163.com
2 网络110
报警服务
服务热线:15964542668 电子邮件:guoyong@topej.com 服务 QQ:350125289
淘学之家(www.topej.com)旗下网站 ICP注册号:鲁ICP备07016860号