利用oracle数据库的blob字段保存各种文件的方法

合集下载

blob字段类型

blob字段类型

blob字段类型
在数据库中,BLOB是一个可以存储二进制文件的字段类型,全称是binary large object。

它通常用于存储图像、音频、视频等二进制文件。

BLOB字段类型可以存储大量的数据,但处理BLOB数据时需要特别注意,因为它们通常比常规数据更难以处理和检索。

BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

不同的数据库系统可能提供了不同种类的BLOB类型,以支持不同大小和性能需求的二进制文件存储。

例如,MySQL提供了四种BLOB类型:TinyBlob、Blob、MediumBlob和LongBlob,它们的最大存储空间分别为255字节、65K、16M和4G。

请注意,如果存储的文件过大,数据库的性能会下降很多。

因此,在设计数据库和应用程序时,需要仔细考虑如何使用BLOB字段类型以及如何管理大型二进制文件的存储和检索。

oracle BLOB字段上传附件步骤

oracle BLOB字段上传附件步骤

1.使用jdk中的方法进行传输。

在ResultSet 中有getBlob()方法,在PreparedStatement 中有setBlob()方法,所以大多数人都会尝试setBlob(),getBlob() 进行读写,或者两个数据库之间BLOB的传输。

这种方法实际上是行不通的,据网上的一些资料介绍,说sun官方的文档有些方法都是错误的。

2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream对BLOB进行读写或两个数据库间的传输。

这种方法我自己尝试过,发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。

根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法:1.新建记录,插入BLOB数据1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的:insert xxxtable(A,B,C) values(empty_blob(),'xxx','yyyy')1.2后面再查询刚才插入的记录,然后更新BLOB,在查询前,注意设置Connection的一个属性:conn.setAutoCommit(false);如果缺少这一步,可能导致fetch out of sequence等异常.1.3 查询刚才插入的记录,后面要加“ for update ”,如下:select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出现row containing the LOB value is not locked的异常1.4 从查询到的 BLOB字段中,获取blob并进行更新,代码如下:BLOB blob = (BLOB) rs.getBlob("A");OutputStream os = blob.getBinaryOutputStream();BufferedOutputStream output = new BufferedOutputStream(os);后面再使用output.write方法将需要写入的内容写到output中就可以了。

使用java读取oracleblob字段实现上传下载

使用java读取oracleblob字段实现上传下载

使用JAVA读取ORACLE BLOB字段实现上传下载大对象类型BLOB全称为Binary Large Objects,即二进制大对象。

可以把BLOB区别为三种形式:声像数据、二进制数据和大文本数据。

因此,最常见的应用就是存储图形、声音等对象,此外大二进制对象、OLE对象也可以通过BLOB类型存入数据库,如果文本对象过大,超出了文本类型的规定长度,则必须用BLOB字段进行存储。

我们在经常使用的编程环境中并不能直接支持BLOB字段,因此需要调用相应的函数完成BLOB的使用。

二实际Struts项目的处理流程1 插入BLOB字段的流程表示层:上传使用struts的<html:file property="drawingFile"/>标签,提交给指定处理的Action,在ActionForm中使用struts自带的FormFile来保存文件。

核心代码:<html:form action="/DrawingInputMultiAction" enctype="multipart/form-data"><html:file property="drawingFile"/>....省略</html:form>控制层:在Action中将传入的ActionForm中的文件字段赋给VO值对象,并调用业务代理类的上传方法。

核心代码:.省略其他set方法.省略}Facade门面:通过业务代理类调用DAO中的上传方法,对客户端完全透明。

public int insertDrawing(DrawingVO drawingVO) throws ComtopModuleException {try {DrawingDAO drawingDAO = new DrawingDAO();return (drawingVO);} catch(DrawingException ex) {throw new ComtopModuleException("", ex);}}持久层:DAO中实现和ORACLE数据库的底层交涉,完成真正的文件上传。

在PB中操作BLOB数据的技巧

在PB中操作BLOB数据的技巧

在PB中操作BLOB数据的技巧在PowerBuilder(PB)中操作BLOB数据是一项常见任务,可以用于存储和检索二进制数据,例如图像、文档和多媒体文件。

下面是操作BLOB数据的一些技巧:1.插入BLOB数据:要插入BLOB数据,首先需要创建一个BLOB变量。

使用Blob类型来声明变量,然后使用Create方法为其分配内存空间。

接下来,使用FileOpen函数打开要插入的文件,并使用ReadFile函数将文件内容读取到BLOB变量中。

最后,使用Insert方法将BLOB数据插入到数据库表中。

以下是一个示例代码片段,演示如何插入BLOB数据:```Blob lb_blobFile ld_fileInteger li_filelb_blob = CREATE Blobli_file = FileOpen("C:\image.jpg", StreamMode!, Read!,Denied!)FileRead(ld_file, lb_blob)FileClose(li_file)dw_1.SetItemBlob(1, lb_blob)dw_1.InsertRow(0)```2.检索BLOB数据:要检索BLOB数据,首先需要从数据库中获取BLOB列的值。

可以使用Retrieve方法检索数据行,然后使用GetItemBlob方法获取BLOB数据并保存到BLOB变量中。

接下来,可以将BLOB数据保存为文件。

以下是一个示例代码片段,演示如何检索并保存BLOB数据:```Blob lb_blobFile ld_fileInteger li_filedw_1.RetrieveRow(0)lb_blob = dw_1.GetItemBlob(1)li_file = FileOpen("C:\image.jpg", StreamMode!, Write!, Shared!)FileWrite(ld_file, lb_blob)FileClose(li_file)```3.更新BLOB数据:要更新BLOB数据,可以使用相同的方法来检索和插入BLOB数据。

ORACLE数据库中主要字段类型的读写例子(包括:Long、Raw、Blob)

ORACLE数据库中主要字段类型的读写例子(包括:Long、Raw、Blob)

ORACLE数据库中主要字段类型的读写例子(包括:Long、Raw、Blob)这里我用的是ORACLE9I, 建立了表C_EMP1_T,结构如下:create table C_EMP1_T(EMP_ID NUMBER(20) not null, //用户IDEMP_NO VARCHAR2(20), //用户编号EMP_DESC LONG, //用户简历USED_DATE DATE, //注册日期EMP_IC_MAC RAW(50), //用户IC卡的MAC号EMP_ADMIN_FLAG CHAR(1), //管理员标志EMP_PICTURE BLOB //用户图像)其中INSERT/UPDATE/SELECT的代码分别如下(DELETE比较简单就省略了,其中SELECT和UPDATE的条件都是记录的rowid):首先BLOB字段是存图片的,所以有一个过程是把图片传到服务器上:先在aspx上加:<form id="Form1" enctype="multipart/form-data" method="post"runat="server"><input id="IoFile" runat="server" type="file"><FONT face="宋体">下一步→</FONT><asp:Button id="btunload" runat="server" Text="上传"></asp:Button> </form>和代码:private void btunload_Click(object sender, System.EventArgs e){btunload.Enabled = false;//获得文件名称string tempfilename = IoFile.PostedFile.FileName;//注: loFile.PostedFile.FileName 返回的是通过文件对话框选择的文件名,这之中包含了文件的目录信息tempfilename = Path.GetFileName ( tempfilename);if (tempfilename.Substring(tempfilename.Length-4,4) == ".bmp") {//去掉目录信息,返回文件名称//判断上传目录是否存在,不存在就建立string tempDirectory = "D:/WWWROOT/MYWEB/dbtest/Image/";if ( ! Directory.Exists ( tempDirectory ) )Directory.CreateDirectory ( tempDirectory ) ;//上传文件到服务器string tempPath = tempDirectory+tempfilename;//得到上传目录及文件名称IoFile.PostedFile.SaveAs ( tempPath );Label1.Text = "<img src='image/"+tempfilename+"'>";Session["filename"] = tempfilename;}else{Label1.Text = "错误的文件类型";}btunload.Enabled = true;/*' 获得并显示上传文件的属性FileName.Text = lstrFileName' 获得文件名称FileType.Text = loFile.PostedFile.ContentType' 获得文件类型FileLength.Text = cStr ( loFile.PostedFile.ContentLength )' 获得文件长度FileUploadForm.visible = falseAnswerMsg.visible = true' 显示上传文件属性End sub */}INSERT:private void BtInsert_Click(object sender, System.EventArgs e){OracleConnection Ocon = new OracleConnection("user id=cmes;da ta source=mes;password=cmes");Ocon.Open();//OracleCommand Ocom = new OracleCommand("insert into c_emp 1_t (EMP_ID,EMP_NO,EMP_DESC,USED_DATE,EMP_IC_MAC,EMP_ADMIN_FLA G,EMP_PICTURE)values(:emp_id,:emp_no,:emp_desc,:emp_date,:emp_ic_m ac,:flag,:picture)",Ocon);OracleCommand Ocom = new OracleCommand("insert into c_emp1 _t (EMP_ID,EMP_NO,EMP_DESC,USED_DATE,EMP_IC_MAC,EMP_ADMIN_FLA G)values(:emp_id,:emp_no,:emp_desc,:emp_date,:emp_ic_mac,:flag)",Oco n);Ocom.Parameters.Add(new OracleParameter("emp_id",OracleType. Number));Ocom.Parameters.Add(new OracleParameter("emp_no",OracleType. VarChar));Ocom.Parameters.Add(new OracleParameter("emp_desc",OracleTyp e.LongVarChar));Ocom.Parameters.Add(new OracleParameter("emp_date",OracleTyp e.DateTime));Ocom.Parameters.Add(new OracleParameter("flag",OracleType.Cha r));Ocom.Parameters.Add(new OracleParameter("emp_ic_mac",OracleT ype.Raw));//Ocom.Parameters.Add(new OracleParameter("picture",OracleType. Blob));Ocom.Parameters["emp_id"].Value = Convert.ToDecimal(tbempid.T ext);Ocom.Parameters["emp_no"].Value = tbempno.Text;Ocom.Parameters["emp_desc"].Value = tbempdesc.Text;string empdate = tbempdate.Text;// yyyymmddOcom.Parameters["emp_date"].Value = new DateTime(Convert.T oInt32(empdate.Substring(0,4)),Convert.ToInt32(empdate.Substring(4,2)),C onvert.ToInt32(empdate.Substring(6,2)) );if (rb1.Checked)Ocom.Parameters["flag"].Value = '1';if (rb2.Checked)Ocom.Parameters["flag"].Value = '2';if (rb3.Checked)Ocom.Parameters["flag"].Value = '3';Ocom.Parameters["emp_ic_mac"].Value = setraw(tbicmac.Text);Ocom.ExecuteNonQuery();/*由与有字段long和blob一起,所以不能在一个insert语句中进行插入,单独insert是成功的OracleConnection Ocon = new OracleConnection("user id=cmes;da ta source=mes;password=cmes");Ocon.Open();OracleCommand Ocom = new OracleCommand("insert into c_emp1 _t (EMP_ID,EMP_PICTURE)values(:emp_id,:picture)",Ocon);Ocom.Parameters.Add(new OracleParameter("emp_id",OracleType. Number));Ocom.Parameters.Add(new OracleParameter("picture",OracleType.B lob));Ocom.Parameters["emp_id"].Value = Convert.ToDecimal(tbempid.T ext);FileStream reader = new FileStream("D:/WWWROOT/MYWEB/dbtes t/Image/002.bmp",FileMode.Open);//在iis中不用用“\”目录结构应该是“/”byte[] tempimage = new byte[reader.Length];reader.Read(tempimage,0,tempimage.Length);//OracleLob tempLob=OracleLob.Null;//tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);//tempLob.Write(tempimage,0,tempimage.Length);//tempLob.EndBatch();reader.Close();Ocom.Parameters["picture"].Size = tempimage.Length;//tempimage.CopyTo(Ocom.Parameters["picture"].Value,0);Ocom.Parameters["picture"].Value = tempimage;Ocom.ExecuteNonQuery();*/string myfilename = Convert.ToString(Session["filename"]);if (myfilename != ""){Ocom.Parameters.Clear();mandText = "update c_emp1_t SET EMP_PICTURE = : PICTURE WHERE EMP_ID= :EMP_ID ";Ocom.Parameters.Add(new OracleParameter("EMP_ID",OracleTy pe.Number));Ocom.Parameters.Add(new OracleParameter("PICTURE",OracleT ype.Blob));Ocom.Parameters["EMP_ID"].Value = Convert.ToDecimal(tbempi d.Text);FileStream reader = new FileStream("D:/WWWROOT/MYWEB/db test/Image/"+myfilename,FileMode.Open);//在iis中不用用“\”目录结构应该是“/”byte[] tempimage = new byte[reader.Length];reader.Read(tempimage,0,tempimage.Length);reader.Close();Ocom.Parameters["PICTURE"].Size = tempimage.Length;Ocom.Parameters["PICTURE"].Value = tempimage;Ocom.ExecuteNonQuery();Session["filename"] = "";}Ocon.Close();}UPDATE:private void btUpdate_Click(object sender, System.EventArgs e){OracleConnection Ocon = new OracleConnection("user id=cmes;da ta source=mes;password=cmes");Ocon.Open();OracleCommand Ocom = new OracleCommand("UPDATE c_emp1_ t SET EMP_ID= :emp_id,EMP_NO= :emp_no,EMP_DESC= :emp_desc,USED_ DATE= :emp_date,EMP_IC_MAC= :emp_ic_mac,EMP_ADMIN_FLAG= :flag W HERE ROWID = :MYROWID",Ocon);Ocom.Parameters.Add(new OracleParameter("MYROWID",OracleTyp e.RowId));Ocom.Parameters.Add(new OracleParameter("emp_id",OracleType. Number));Ocom.Parameters.Add(new OracleParameter("emp_no",OracleType. VarChar));Ocom.Parameters.Add(new OracleParameter("emp_desc",OracleTyp e.LongVarChar));Ocom.Parameters.Add(new OracleParameter("emp_date",OracleTyp e.DateTime));Ocom.Parameters.Add(new OracleParameter("flag",OracleType.Cha r));Ocom.Parameters.Add(new OracleParameter("emp_ic_mac",OracleT ype.Raw));Ocom.Parameters["MYROWID"].Value = TBROWID.Text;Ocom.Parameters["emp_id"].Value = Convert.ToDecimal(tbempid.T ext);Ocom.Parameters["emp_no"].Value = tbempno.Text;Ocom.Parameters["emp_desc"].Value = tbempdesc.Text;string empdate = tbempdate.Text;// yyyymmddOcom.Parameters["emp_date"].Value = new DateTime(Convert.T oInt32(empdate.Substring(0,4)),Convert.ToInt32(empdate.Substring(4,2)),C onvert.ToInt32(empdate.Substring(6,2)) );if (rb1.Checked)Ocom.Parameters["flag"].Value = '1';if (rb2.Checked)Ocom.Parameters["flag"].Value = '2';if (rb3.Checked)Ocom.Parameters["flag"].Value = '3';Ocom.Parameters["emp_ic_mac"].Value = setraw(tbicmac.Text);Ocom.ExecuteNonQuery();string myfilename = Convert.ToString(Session["filename"]);if (myfilename != ""){Ocom.Parameters.Clear();mandText = "update c_emp1_t SET EMP_PICTURE = : PICTURE WHERE EMP_ID= :EMP_ID ";Ocom.Parameters.Add(new OracleParameter("EMP_ID",OracleTy pe.Number));Ocom.Parameters.Add(new OracleParameter("PICTURE",OracleT ype.Blob));Ocom.Parameters["EMP_ID"].Value = Convert.ToDecimal(tbempi d.Text);FileStream reader = new FileStream("D:/WWWROOT/MYWEB/db test/Image/"+myfilename,FileMode.Open);//在iis中不用用“\”目录结构应该是“/”byte[] tempimage = new byte[reader.Length];reader.Read(tempimage,0,tempimage.Length);reader.Close();Ocom.Parameters["PICTURE"].Size = tempimage.Length;Ocom.Parameters["PICTURE"].Value = tempimage;Ocom.ExecuteNonQuery();Session["filename"] = "";}Ocon.Close();}SELECT(由于图片是直接向客户端输出,所以需要另一个页面来输入图片):private void btselect_Click(object sender, System.EventArgs e){if (TBROWID.Text.Length < 18){TBROWID.Text = "请输入正确的ROWID";return;}OracleConnection Ocon = new OracleConnection("user id=cmes;da ta source=mes;password=cmes");Ocon.Open();OracleCommand Ocom = new OracleCommand("select EMP_ID,EMP _NO,EMP_DESC,USED_DATE,EMP_IC_MAC,EMP_ADMIN_FLAG,EMP_PICTUR E from c_emp1_t where rowid = :emprowid",Ocon);Ocom.Parameters.Add(new OracleParameter("emprowid",OracleTyp e.RowId));Ocom.Parameters["emprowid"].Value = TBROWID.Text;OracleDataReader reader = Ocom.ExecuteReader();while (reader.Read()){if (!(reader.IsDBNull(0)))tbempid.Text = Convert.ToString( reader.GetDecimal(0));if (!(reader.IsDBNull(1)))tbempno.Text = reader.GetString(1);if (!(reader.IsDBNull(2)))tbempdesc.Text = reader.GetString(2);if (!(reader.IsDBNull(3))){DateTime DT = reader.GetDateTime(3);tbempdate.Text = DT.ToString("yyyyMMdd");}if (!(reader.IsDBNull(4))){byte[] temp = new byte[4000];reader.GetBytes(4,0,temp,0,4000);tbicmac.Text = getraw(temp);}elsetbicmac.Text = "";if (!(reader.IsDBNull(5))){/*char tempflag = reader.GetChar(5); //不支持此方法switch (tempflag){case '1':rb1.Checked = true;break;case '2':rb2.Checked = true;break;default :rb3.Checked = true;break;}*/char tempflag = Convert.ToChar(reader.GetValue(5));switch (tempflag){case '1':rb1.Checked = true;break;case '2':rb2.Checked = true;break;default :rb3.Checked = true;break;}}if (!(reader.IsDBNull(6))){Label1.Text = "<img src='webform3.aspx?ROWID="+TBROWI D.Text+"'>";}}reader.Close();Ocon.Close();}webform3.aspx的程序:private void Page_Load(object sender, System.EventArgs e){OracleConnection Ocon = new OracleConnection("user id=cmes;da ta source=mes;password=cmes");Ocon.Open();OracleCommand Ocom = new OracleCommand("select EMP_PICTUR E from c_emp1_t where rowid = :emprowid",Ocon);Ocom.Parameters.Add(new OracleParameter("emprowid",OracleTyp e.RowId));Ocom.Parameters["emprowid"].Value = Request.Params["ROWID"];OracleDataReader reader = Ocom.ExecuteReader();while (reader.Read()){if (!(reader.IsDBNull(0))){OracleLob tempBlob = reader.GetOracleLob(0);byte[] tempbuffer = new byte[tempBlob.Length];//tempBlob.BeginBatch(OracleLobOpenMode.ReadWrite);会有错误ORA-22292: 无法在没有事务处理的情况下以读写模式打开 LOBtempBlob.BeginBatch();tempBlob.Read(tempbuffer,0,tempbuffer.Length);tempBlob.EndBatch();//下面是把具体的文件保存出来BinaryWriter writer = new BinaryWriter(new FileStream("D:/ WWWROOT/MYWEB/dbtest/Image/temp.bmp",FileMode.Create));for(int i=0;i<tempbuffer.Length;i++){writer.Write(tempbuffer[i]);}writer.Close();//下面是直接把图片用流向客户端输出Response.BinaryWrite(tempbuffer);}}reader.Close();Ocon.Close();}这些代码在2000下测试通过的,初次写代码有些凌乱,请大家多多提意见。

opengauss blob类型

opengauss blob类型

opengauss blob类型OpenGauss Blob类型是一种在数据库中存储大型二进制对象的数据类型。

它可以用于存储图像、音频、视频文件等大型文件,而不是将这些文件存储在文件系统中。

本文将介绍OpenGauss Blob类型的特点、用法以及与其他数据类型的区别。

一、OpenGauss Blob类型的特点1. 大容量存储:Blob类型可以存储非常大的二进制数据,最大容量可达到4TB。

2. 高性能访问:Blob类型支持高性能的读写操作,可以快速存取大型对象。

3. 数据安全性:Blob类型的数据在数据库中进行管理,可以进行权限控制和事务管理,提高数据的安全性。

4. 数据完整性:Blob类型支持数据校验机制,可以确保存储的二进制数据的完整性。

二、OpenGauss Blob类型的用法1. 创建Blob类型的列:可以在CREATE TABLE语句中定义Blob 类型的列,例如:CREATE TABLE my_table (id INT, data BLOB);2. 插入Blob数据:可以使用INSERT语句向Blob类型的列中插入二进制数据,例如:INSERT INTO my_table VALUES (1,E'\\x0123456789ABCDEF');3. 查询Blob数据:可以使用SELECT语句查询Blob类型的列中的数据,例如:SELECT data FROM my_table WHERE id = 1;4. 更新Blob数据:可以使用UPDATE语句更新Blob类型的列中的数据,例如:UPDATE my_table SET data = E'\\x0123456789ABCDEF' WHERE id = 1;5. 删除Blob数据:可以使用DELETE语句删除Blob类型的列中的数据,例如:DELETE FROM my_table WHERE id = 1;三、OpenGauss Blob类型与其他数据类型的区别1. Blob类型与varchar类型的区别:Blob类型可以存储大容量的二进制数据,而varchar类型适用于存储较短的字符串。

oracle大字段的使用(转)

oracle⼤字段的使⽤(转)数据库⼤字段(Clob, Blob)不适合存储超过1MB的数据通常数据库都提供Clob,Blob,Text,Long等⼤字段类型来存放超过4K的数据,然⽽这绝不意味着应该使⽤⼤字段来保存超过1MB以上的数据⽂件。

之所以有⼤字段,往往是因为varchar类型有⼀定的长度限制,例如4K。

超过此长度的⽂本和⼆进制数据必须使⽤⼤字段保存。

不过通常情况下,⼤字段不意味着保存很⼤的⽂件,通常只是⼏⼗到⼏百KB的数据,例如很长的⽂章,图标,⼩图⽚等等。

超过1MB以上的数据保存在数据库有诸多的性能问题:速度慢Web Server可以直接读取硬盘⽂件,然后返回⽂件给客户端,或者应⽤服务器读硬盘⽂件返回客户端,其效率要远远超过应⽤服务器访问数据库读取数据返回客户端。

操作不⽅便必须把数据库打开⼀个流,构造⼀个Buffer,然后再输出⼀个ServletOutputStream。

占⽤数据库连接,加重数据库访问负载不说,如果⽤户突然中断下载,还需要处理数据库关闭动作,容易造成性能问题。

如果把整个数据读⼊内存再输出,则内存占⽤⾮常客观。

如果是硬盘⽂件,只要返回⼀个URL就可以了。

即使你不希望⽤户直接访问到⽂件,你也可以构造⼀个IOStream来输出⽂件,既不会占⽤数据库资源,传输速度也快。

性能有问题特别的情况是,如果并发很多⽤户来下载⼤⽂件的时候,应⽤服务器要占⽤⾮常多的内存来缓存⽂件内容,假设并发10个⽤户,下载10MB 的⽂件,JVM的峰值就⾄少需要100MB内存来⽀撑,很容易造成JVM崩溃。

Oracle其实还有⼀种File的Blob类型,虽然也是Blob,但是实际上File是保存在硬盘上的,这种⽅式的你可以试试看,只不过我觉得这种⽅式还不如直接操作⽂件⽅便,既然原理是⼀样的。

另外补充⼀点,常规的数据库备份都是⽆法备份Blob数据的,所以如果你把⽂件都保存到Blob⾥⾯去的话,数据库的备份是⼀个很头疼的⼤问题,你必须单独写程序把blob数据读出来,再写到硬盘⽂件去,再备份⽂件。

Oracleblob字段的插入和更新

这样就问题就顺利的攻克了!
存在blob类型的字段须要在blob字段中先使用emptyblob让该条记录先保存到数据中
Oracleblob字 段 的 插 入 和 更 新
blob字段。事实上是用来存储二进制类型的数据的,比方:大文本、文件、图片等信息直接存放到数据库中的一种解决方式 所以,假设对于新插入的记录。存在blob类型的字段,须要在blob字段中先使用EMPTY_BLOB(),让该条记录先保存到数据库中; 然后,使用更新语句的方式,更新blob字段的值。代码例如以下: //构造更新语句: string strSQL="update tablename set Rangecoords=:coords where 查询条件"; //创建oracle參数 byte[] bigTextByte = System.Text.Encoding.UTF8.GetBytes(bigText); OracleParameter coordsPara = new OracleParameter(":coords", OracleType.Blob, bigTextByte.Length); OracleParameter coordsPara.Value = bigTextByte; OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; mandText = strSQL; cmd.Parameters.Add(coordsPara); cmd.ExecuteNonQuery();

oracle datafile block 格式 说明

Oracle数据库的数据文件(datafile)是存储实际数据的文件,每个数据文件由多个块(block)组成。

每个块的大小默认为8KB,但可以根据需要进行配置。

在Oracle中,数据文件的块格式有以下几种:
1. 数据块(Data Block):这是最常见的块类型,用于存储实际的数据。

每个数据块都有一个唯一的标识符,称为块地址(Block Address)。

2. 空块(Empty Block):当一个数据块不再需要时,它会被标记为空块。

空块可以被重用,以存储新的数据。

3. 空闲列表头块(Free List Head Block):这是一个特殊的块,用于存储空闲列表的信息。

空闲列表是一个链表,用于跟踪可用的空块。

4. 空闲列表条目块(Free List Entry Block):这是空闲列表中的一个元素,包含一个指向空闲数据块的指针。

5. 索引根块(Index Root Block):这是B树索引的一个特殊块,用于存储索引的元数据和叶节点的指针。

6. 位图块(Bitmap Block):这是一种特殊类型的块,用于存储位图信息。

位图是一种紧凑的数据结构,用于表示一组布尔值。

7. 回滚段头块(Rollback Segment Header Block):这是回滚段的一个特殊块,用于存储回滚段的元数据。

8. 临时段头块(Temporary Tablespace Header Block):这是临时表空间的一个特殊块,用于存储临时表空间的元数据。

oracle中导出和导入部分blob,clob字段

oracle中导出和导入部分blob,clob字段今天遇到个问题,在A,B库中,表结构相同,要在A库A表中,导出某部分记录到B库的A表,问题是两个库的两个相同表中,都含有BLOB,CLOB字段,琢磨了下,暂时找到了个方法,当然不知道有没更好的工具,那就是用oracle自身的exp和IMP,方法为:1 exp XXX/XXX@XXXX tables=(xxxx) file=c:\xxx.dmpquery="""where birthday>= to_date('1980.12.18','yyyy-mm-dd')"""这是在WINDOWS平台下,对其他平台的话,要注意一下双引号转义:exp ….. query=\”where col1 \< 1000\”exp ….. query=\”where col1 \< ’1000′\”或者干脆写在一个文件TXT里,就不用考虑这么多了,比如首先建立一个1.txt文件:tables=employeefile=f:/exp.dmpquery="where birthday>= to_date('1980.12.18','yyyy-mm-dd')"然后:exp user/user@bsrun parfile=1.txtexp bs/bs@ORCL_10.116.17.223 tables=ivc_bus_payletter file=d:\ivc_bus_payletter.dmp query="""where lstmoddt like'20150702%'"""2 IMP时,注意导入时,用参数ignore=yes,即可在原来的表上追加记录拉,很简单imp bs/bs@ORCL_10.116.16.110 tables=ivc_bus_payletter file=d:\ivc_bus_payletter.dmp ignore=y。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用oracle数据库的blob字段保存各种文件的方法作者:卢小丽来源:《电脑知识与技术》2012年第22期摘要:在日常工作中,许多单位或企业都累积了大量的文件。

如何保存和组织这些文件,如何高效地查阅和使用它们,则成了一个普遍存在的问题。

为解决这一问题,用powerbuilder 作为开发工具编写了一个小软件,通过运行特殊的SQL语句,将各种文件保存于oracle的二进制大字段中,并可以随时查看和下载文件。

关键词:文件;二进制大字段;SQL语句;powerbuilder中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)22-5271-04Using Binary Large Field to Save all Documents MethodLU Xiao-li(Guangxi Nanning City State Taxation Bureau , Nanning 530022, China)Abstract: In their daily work, many units or enterprises have accumulated a lot of documents.How to store and organize these documents, how to effectively access and use them, then became a widespread problem.In order to solve this problem, using PowerBuilder as a designer tool to write a small software, by running a special SQL statements, the files are stored in the Oracle binary large field, and can be readily viewed and downloaded .Key words: documents; binary large field; SQL statement; powerbuilder在日常工作中,各单位或企业都累积了大量的文件,如WORD文档,EXCEL文档、多媒体文档、图片等。

如何保存和组织这些文件,如何高效地查阅和使用它们,则成了一个普遍存在的问题。

例如:该如何分门别类地保存和组织大量文件?该如何保证每台客户端中看到的都是最新修改过的文件?笔者在本单位的软件开发中就遇到类似问题。

作者所要求开发的一个软件,要求每台客户端都能通过该软件,及时上传和浏览打印各种最新的文档。

为解决这个问题,通过查阅大量资料后,笔者决定用oracle数据库的blog字段,来解决文件的保存和查询问题。

并且用power builder作为程序开发工具,开发出一个小软件。

该软件可以上传各种文档、图像、二进制文件、多媒体文件等到oracle数据库中,并可以随时查看和下载。

1原理及技巧随着计算机技术的不断发展和普及,数据库,尤其是关系型数据库,在日常工作和生活中也得到了普遍应用。

关系型数据库中,一般常用的字段有字符型、数值型、日期型、逻辑型等类型。

但还有一种特殊的字段,是以二进制形式存放数据的,长度是0~2GB字节,这就是二进制大字段。

如oralce、mysql、access中的blog字段。

由于数据是以最基本的二进制保存,不论其原来的数据是简单的类型还是复杂的类型,数据库都只当其是一连串的二进制数据,因此,就解决了各种文档、图像、多媒体等各种文件的存储问题。

在powerbuilder中,主要是利用blog变量和fileread语句或filewrited语句来从文件中读取数据或写数据,再用到两条特殊的SQL命令——UPDATEBLOB和SELECTBLOB,来跟数据库进行交互。

具体见图1。

图1过程图一个table中,blog字段不能单独存在,至少要有一个常规字段,用来标识一条记录。

由于blog字段比较特殊,对其进行操作的sql语句也比较特别。

添加数据时,要先insert一个空的blog字段,再用updateblob语句将二进制数据添加进去。

导出数据时,用selectblob语句查询导出。

例如:insert into test_photo (id,photo) values(‘01’,empt y_blob())updateblob test_photo set photo=:b1 where id=’01’( b1是pb中blog类型的变量)selectblob photo into :b1 from test_photo where id=’01’( b1是pb中blog类型的变量)用其他的软件开发工具也是类似。

2程序结果该小程序运行后出现如图2的界面,程序的代码附在文后。

图2运行结果图窗口的左半部是pb的ole控件,点击后可以直接打开word文档或excel文档。

对于其他类型的文件,还不支持直接打开,可下载后在操作系统中打开或运行。

主要程序代码:(代码都已测试通过)上传按扭的代码blob m_b1 ,m_b2blob tot_bstring s1 ,s2,s3,file1, m_filename , m_hzlong n1,jj ,li_fnum ,li_bytes , ii,ll,loops ,nbr,m_countll=getfileopenname(’选择文件’,path1,file1,’’,’file(*.*),*.*’,’c:\’ )if ll<>1 thenmessagebox(’’,’没选中文件’)returnend ifst_1.text=file1m_filename=st_1.textm_hz=right(file1,3)setnull(tot_b)setnull(m_b1)m_count=0select count(*) into :m_count from test_photo where id=:file1 ; //查看数据库中是否有同名文件if m_count>1 thenmessagebox(’’,’已有同名文件!’)returnend ifli_bytes=filelength(path1)li_fnum = fileopen(path1, streammode!)if li_fnum>0 thenif li_bytes > 32765 then//一次只能读32765字节,要先判断读几次if mod(li_bytes, 32765) = 0 thenloops = li_bytes/32765elseloops = (li_bytes/32765) + 1end ifelseloops = 1end iffor ii = 1 to loopsjj = fileread(li_fnum, m_b1) //将文件分次读入bolb变量tot_b=tot_b + m_b1//若大于32765字节,将bolb变量内容加起来nextm_b2=blobmid(tot_b,1,li_bytes)insert into test_photo (id,photo,hz) values(:m_filename,empty_blob(),:m_hz) ;//增加记录updateblob test_photo set photo=:tot_b where id=:m_filename ; //上传bolb变量的内容 if sqlca.sqldbcode = 0 thencommit ;messagebox("","保存成功!")elsemessagebox("sql error", sqlca.sqlerrtext)end ifelsemessagebox(’’,’无法打开文件!’)end iffileclose(li_fnum)dw_1.retrieve()下载按扭的代码long ii,jj ,li_FileNum ,li_bytes ,loops,m_rowinteger rtnstring m_id,m_hz,m_ml,s2,m_fileblob b1 ,tob_bsetnull(b1)m_row=dw_1.getrow()if m_row>0 thenst_1.text=dw_1.object.id[m_row]m_ml=trim(sle_1.text)m_id=trim(st_1.text)m_hz=right(m_id,3)m_file=m_ml+"/"+m_idif DirectoryExists(m_ml)=false thenmessagebox(’’,’指定下载目录不存在!’)returnend ifmessagebox(’’,’开始下载!’)selectblob photo into :b1 from test_photo where id=:m_id;//messagebox(’sqlca.SQLCode’,sqlca.SQLCode )if not isnull(b1) thenli_FileNum = FileOpen(m_file , StreamMode!, Write!, Shared!, replace!) li_bytes=len(b1)//messagebox(’’,string(li_bytes))jj= FileWriteex(li_FileNum, b1)fileclose(li_FileNum)messagebox(’’,’文件’+m_file+’下载完毕!’)elsemessagebox(’’,’无文件内容!’)end ifend if打开按扭的代码(先下载,再打开)long ii,jj ,li_filenum ,li_bytes ,loops,m_rowinteger rtnstring m_id,m_hz,m_ml,s2,m_fileblob b1 ,tob_bsetnull(b1)m_row=dw_1.getrow()if m_row>0 thenst_1.text=dw_1.object.id[m_row]m_ml=trim(sle_1.text) //取出默认下载路径m_id=trim(st_1.text)m_hz=right(m_id,3)m_file=m_ml+"/aaaa."+m_hzchoose case upper(m_hz) //根据不同类型使用不同语句打开case ’doc’ole_1.insertclass(’word.document’)case ’xls’ole_1.insertclass(’excel.sheet’)case elsemessagebox(’抱歉’,’本程序只能自动打开doc文件或xls文件,其他类型文件请下载后再在程序外打开。

相关文档
最新文档