如何在oracle的blob字段里保存多个文件
<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><personname w:st="on"><span lang="EN-US"><font color="#000000" size="3">cheungmine@gmail.com</font></span></personname>
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
Oracle的BLOB字段类型可以用来保存长2进制数据。但是通常读写BLOB字段数据的代码都是很罗嗦,非细心编码很容易出错。我把这个功能集成到我的OCI包装库(ORADBI)中。下面的例子就是演示如何使用ORADBI把多个文件按保存到一个字段里。
我在另外的例子中将演示如何把BLOB字段中的数据还原为文件。
整个ORADBI是我在OCI基础上写的C语言API。从创作这个API到一直不断的更新维护,已经有1年多了。我也将一直维护下去,不断完善和添加新的功能。ORADBI是完全免费和完全开源的,使用者只要不声明为其版权所有,可以用它做任何事情。
这是个直接利用OCI操作BLOB的例子。我相信,这是你能找到的最快捷的方法。
1)首先保证你的机器上可以使用Oracle9i或<chmetcnv w:st="on" unitname="g" sourcevalue="10" hasspace="False" negative="False" numbertype="1" tcsc="0"><span lang="EN-US">10g</span></chmetcnv>的客户端。Oracle<chmetcnv w:st="on" unitname="g" sourcevalue="10" hasspace="False" negative="False" numbertype="1" tcsc="0">10g</chmetcnv>只需要安装Windows即时客户端。
2)下载我编写的ORADBI库。我提供了完整的库代码和例子程序。
http://download.csdn.net/source/589896
3)定义你要保存的文件路径,如:
const char* arrLobFiles[] = {
"E://eBookLib-计算机//C&C++//APress.Cryptography in C and C++_SourceCode.rar",
"E://eBookLib-计算机//C&C++//Charles.River.Media.Algorithms.For.Compiler.Design.eBook-LiB.chm",
"E://eBookLib-计算机//C&C++//C与C++中的异常处理.pdf",
"E://eBookLib-计算机//C&C++//The art of assmebly language.pdf",
"E://eBookLib-计算机//C&C++//Jones.And.Bartlett.Publishers.Foundations.Of.Algorithms.Using.Cpp.Pseudocode.3rd.Edition.eBook-Li.chm",
"E://eBookLib-计算机//C&C++//The C++ Standard Library.pdf",
"E://eBookLib-计算机//C&C++//GCC--CompleteReference.pdf",
"E://eBookLib-计算机//C&C++//VC技术内幕第五版.chm",
"E://eBookLib-计算机//Network&Tcpip//ALTHOS.Introduction.To.Data.Networks.PDN.LAN.MAN.WAN.and.Wireless.Data.Technologies.and.Systems.e.chm",
"E://eBookLib-计算机//Network&Tcpip//Digital Satellite Communications 2nd Ed - book.pdf",
"E://eBookLib-计算机//Network&Tcpip//McGraw.Hill.Storage.Networks.The.Complete.Reference.chm",
"E://eBookLib-计算机//Network&Tcpip//UNIX Network Programming Volume 1_3rd Edition-The Sockets Networking API.chm"
};
4)创建合适的表在Oracle9i或<chmetcnv w:st="on" unitname="g" sourcevalue="10" hasspace="False" negative="False" numbertype="1" tcsc="0"><span lang="EN-US">10g</span></chmetcnv>中,我的例子是采用如下的语句创建的表:
-- Create table
create table TEST
(
BM VARCHAR2(10),
NAME VARCHAR2(100),
BIRTH DATE,
DATA BLOB
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
5)更改适合你的登录方式,改变下面的预定义值:
#define ORADB_SERVICE "CHEUNG"
#define ORADB_LOGUSER "mineusr"
#define ORADB_PASSWORD "minepwd"
下面是写文件到BLOB字段的完整的例子:
- //
- //write_blobfile.c-写BLOBFILE的例子
- //使用ORADBI.dll
- //cheungmine@gmail.com,保留所有权利
- //
- //内存泄漏检测
- //在需要检测的地方放置语句:
- //_CrtDumpMemoryLeaks();
- //以下3句的次序不能改变
- #define_CRTDBG_MAP_ALLOC
- #include<stdlib.h>
- #include<crtdbg.h>
- //包含唯一的ORADBI头文件
- #include"../oradbi.h"
- #ifdef_DEBUG
- #pragmacomment(lib,"../oradbi_dll/debug/oradbid.lib")
- #else
- #pragmacomment(lib,"../oradbi_dll/release/oradbi.lib")
- #endif
- #defineORADB_SERVICE"CHEUNG"
- #defineORADB_LOGUSER"mineusr"
- #defineORADB_PASSWORD"minepwd"
- /*==================================================
- --Createtable
- createtableTEST
- (
- BMVARCHAR2(10),
- NAMEVARCHAR2(100),
- BIRTHDATE,
- DATABLOB
- )
- tablespaceUSERS
- pctfree10
- initrans1
- maxtrans255
- storage
- (
- initial64K
- minextents1
- maxextentsunlimited
- );
- ====================================================*/
- //
- //下面的文件被插入到一个DATA字段
- //在这里定义你要插入的文件,这些文件必须存在
- //
- constchar*arrLobFiles[]={
- "E://eBookLib-计算机//C&C++//APress.CryptographyinCandC++_SourceCode.rar",
- "E://eBookLib-计算机//C&C++//Charles.River.Media.Algorithms.For.Compiler.Design.eBook-LiB.chm",
- "E://eBookLib-计算机//C&C++//C与C++中的异常处理.pdf",
- "E://eBookLib-计算机//C&C++//Theartofassmeblylanguage.pdf",
- "E://eBookLib-计算机//C&C++//Jones.And.Bartlett.Publishers.Foundations.Of.Algorithms.Using.Cpp.Pseudocode.3rd.Edition.eBook-Li.chm",
- "E://eBookLib-计算机//C&C++//TheC++StandardLibrary.pdf",
- "E://eBookLib-计算机//C&C++//GCC--CompleteReference.pdf",
- "E://eBookLib-计算机//C&C++//VC技术内幕第五版.chm",
- "E://eBookLib-计算机//Network&Tcpip//ALTHOS.Introduction.To.Data.Networks.PDN.LAN.MAN.WAN.and.Wireless.Data.Technologies.and.Systems.e.chm",
- "E://eBookLib-计算机//Network&Tcpip//DigitalSatelliteCommunications2ndEd-book.pdf",
- "E://eBookLib-计算机//Network&Tcpip//McGraw.Hill.Storage.Networks.The.Complete.Reference.chm",
- "E://eBookLib-计算机//Network&Tcpip//UNIXNetworkProgrammingVolume1_3rdEdition-TheSocketsNetworkingAPI.chm"
- };
- //
- //显示如何把多个文件插入到BLOB字段
- //
- voidinsert_blob_data()
- {
- lresultrc;
- ora_error_terr;//不需要释放
- ora_paramp[4];
- ora_datetimedt;
- ora_connectioncon=0;
- ora_sqlstmtstmt=0;
- //用于绑定LOB变量的结构
- ORADBI_InBindinbind;
- //利用ORADBI自带的写blobfile功能
- //ORA_inbind_lobfile_init必须在ORA_sqlstmt_bind_lob之前调用
- ORA_inbind_lobfile_init(&inbind,0,arrLobFiles,sizeof(arrLobFiles)/sizeof(arrLobFiles[0]),&err);
- //创建连接
- rc=ORA_connection_create(&con,ORADB_SERVICE,ORADB_LOGUSER,ORADB_PASSWORD,OCI_THREADED|OCI_OBJECT,FALSE,&err);
- assert(rc==_SUCCESS);
- //创建SQL
- rc=ORA_sqlstmt_create(&stmt,con,"insertintoTEST(BM,NAME,BIRTH,DATA)values(:bm,:name,:birth,:blob)",-1,0,&err);
- assert(rc==_SUCCESS);
- //绑定变量
- rc=ORA_sqlstmt_bind(stmt,":bm",ODT_TEXT,0,&p[0],&err);
- assert(rc==_SUCCESS);
- rc=ORA_sqlstmt_bind(stmt,":name",ODT_TEXT,100,&p[1],&err);
- assert(rc==_SUCCESS);
- rc=ORA_sqlstmt_bind(stmt,":birth",ODT_DATE,0,&p[2],&err);
- assert(rc==_SUCCESS);
- //绑定BLOB变量
- rc=ORA_sqlstmt_bind_lob(stmt,":blob",0,&inbind,0,&p[3],&err);
- assert(rc==_SUCCESS);
- //设置变量的值
- rc=ORA_param_set_string(p[0],"2008",-1,&err);
- rc=ORA_param_set_string(p[1],"BeiJing",-1,&err);
- ORA_datetime_create(&dt,1);
- rc=ORA_param_set_datetime(p[2],dt,&err);
- ORA_datetime_free(dt);
- //执行插入
- rc=ORA_sqlstmt_execute(stmt,MOD_DEFAULT,0,&err);
- assert(rc==_SUCCESS);
- rc=ORA_connection_commit(con,&err);
- assert(rc==_SUCCESS);
- //释放结束
- ORA_inbind_lobfile_free(&inbind);
- ORA_sqlstmt_free(stmt);
- ORA_connection_free(con);
- }
- //
- //主程序
- //
- intmain(intargc,char*argv[])
- {
- insert_blob_data();
- _CrtDumpMemoryLeaks();
- return0;
- }