运用C#处理lob数据类型 (Oracle)

本文介绍了使用C#处理Oracle数据库中的Blob数据类型的方法。详细讲述了如何存储和读取图片数据,并提供了三种不同的实现方案,包括存储过程和直接SQL操作。

 运用 C# 处理 lob 数据类型 Oracle
  一、 介绍不规则数据类型
   随着媒体技术的进步,人们的要求也越来越多,因此现在的数据库中不单单存储简单的数据类型,还可以存储图片、文件、声音等非常庞大的二进制数据,我们把 这种不规则数据类型叫做LOB(Large Object)。对于LOB数据即可以存储50K还可以存储50M的二进制数据内容。
  Oracle数据库中,大型数据类型有以下几种:
  Clob:和long型相似,clob可以存储单字节型数据
  Nclob:Nclob存储定宽的多字节国家字符集数据
  Blob:可以存储无结构的二进制数据如图片
  Bfile:Bfile允许对Oracle数据库以外存储的大型二进制文件进行只读形式的访问。和其它三种lob类型数据不同的是,bfile类型数据存储在一个单独的文件中,该文件不由Oracle来维护。
  在这里主要介绍运用C#储存和读取图片(数据库Oracle)。
  二、 处理 Blob 数据项的方式
  1.首先介绍数据表结构
  表:student
  字段名 类型 说明
  STUDENTID number id关键字段
  SNAME varchar2(50) 姓名
  SPHOTO Blob 图片
  定义了序列SEQ_STUDENT_ID
  
  2.接着介绍存储Blob数据项方式
  注意:Blob数据不能象其它类型数据一样直接插入(INSERT)。插入前必须先插入一个空的Blob对象,BLOB类型的空对象为EMPTY_BLOB(),之后通过SELECT命令查询得到先前插入的记录并锁定,继而将空对象修改为所要插入的Blob对象。
  ⑴ 调用储存过程方式
  http://www.cnblogs.com/surprise/archive/2005/04/19/140461.html
  优点:层次清晰明了,存储速度快
  缺点:运用dbms_lob包用dbms_lob.write()写入只能存储32k以下的图片
  ⑵ 另一种调用储存过程方式
  在Oracle中写存储过程如下:
  create or replace procedure update_student_clob (
  id in number,
  file_name in varchar2)
  is
  b_lob BLOB;
  f_lob BFILE;
  BEGIN
  --首先把SPHOTO数据插入空值
  Update student set SPHOTO=empty_blob() where STUDENTID=id;
  --通过SELECT命令查询得到先前插入的记录并锁定
  SELECT SPHOTO INTO b_lob from student where STUDENTID=id for update;
  --读取图片文件对象
  f_lob:=bfilename(‘bb_images’, file_name);
  --打开图片文件对象
  dbms_lob.fileopen(f_lob,dbms_lob.file_readonly);
  --把图片文件对象写入Blob数据中
  dbms_lob.loadfromfile(b_lob,f_lob,dbms_lob.getlength(f_lob));
  dbms_lob.fileclose(f_lob);
  END;
  /
  其中:id代表关键字段id,file_name代表文件名 
  bb_images代表目录对象,目录对象创建如下
  create directory bb_images as ‘d:/kk’;
  在C#中的代码部分与
  http://www.cnblogs.com/surprise/archive/2005/04/19/140461.html雷同,在这里就不必多说了
  优点:无论多大的图片都能处理,速度上也非常快
  缺点:只能存储数据库本地的图片
  ⑶ 不用储存过程的方式
  原代码ConsoleApplication2.rar (推荐,在我们公司项目中就用到了)
  优点:解决了所有以上的缺点
  缺点:破坏了项目的层次感

        3.是用C#的代码方式
   // 利用传参数
                        OracleConnection Con  =   new  System.Data.OracleClient.OracleConnection(strCon);
                        Con.Open();
    
// 自己用时,替换自己的sql语句
                     string  cmdText = " insert into xmgl_wd(pk_wdbh,wdmc,lbbh,wdnr,wdfjdz,wdsj,istj) values (XMGL_WD_SEQ.Nextval,'' " + wdmc + " '','' " + lbbh + " '',:pb,'' " + wdfjdz + " '', " + str_add_wdsj + " ,'' " + istj + " '') " ;
                        OracleCommand cmd 
=   new  OracleCommand(cmdText,Con);
                        OracleParameter op 
=   new  OracleParameter( " pb " ,OracleType.Clob);
                        op.Value 
=  wdnr;
                        cmd.Parameters.Add(op);
                        cmd.ExecuteNonQuery();
                        Con.Close();


  4.最后介绍读取Blob数据项方式
   原代码 WebImage.rar 读取图片的方式比较简单,首先把 Blob 从数据库中读取出来,接着生成图片格式,最后输出图片就行。
  
  以上的方式都是试验成功,如果哪位大虾有更好的方式请随时交流哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值