如何在oracle的blob字段里保存多个文件
Oracle的BLOB字段类型可以用来保存长2进制数据。但是通常读写BLOB字段数据的代码都是很罗嗦,非细心编码很容易出错。我把这个功能集成到我的OCI包装库(ORADBI)中。下面的例子就是演示如何使用ORADBI把多个文件按保存到一个字段里。
我在另外的例子中将演示如何把BLOB字段中的数据还原为文件。
整个ORADBI是我在OCI基础上写的C语言API。从创作这个API到一直不断的更新维护,已经有1年多了。我也将一直维护下去,不断完善和添加新的功能。ORADBI是完全免费和完全开源的,使用者只要不声明为其版权所有,可以用它做任何事情。
这是个直接利用OCI操作BLOB的例子。我相信,这是你能找到的最快捷的方法。
1)首先保证你的机器上可以使用Oracle9i或 10g 的客户端。Oracle 10g 只需要安装Windows即时客户端。
2)下载我编写的ORADBI库。我提供了完整的库代码和例子程序。
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或 10g 中,我的例子是采用如下的语句创建的表:
-- 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 "CHEUNG"
#define "mineusr"
#define "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
#pragma comment(lib, "../oradbi_dll/debug/oradbid.lib")
#else
#pragma comment(lib, "../oradbi_dll/release/oradbi.lib")
#endif
#define ORADB_SERVICE "CHEUNG"
#define ORADB_LOGUSER "mineusr"
#define ORADB_PASSWORD "minepwd"
/*==================================================
-- 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
);
====================================================*/
//
// 下面的文件被插入到一个DATA字段
// 在这里定义你要插入的文件, 这些文件必须存在
//
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"
};
//
// 显示如何把多个文件插入到BLOB字段
//
void
{
lresult rc;
// 不需要释放
ora_param p[4];
ora_datetime dt;
ora_connection con = 0;
ora_sqlstmt stmt = 0;
// 用于绑定LOB变量的结构
ORADBI_InBind inbind;
// 利用ORADBI自带的写blobfile功能
// ORA_inbind_lobfile_init 必须在ORA_sqlstmt_bind_lob之前调用
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
"insert into TEST (BM,NAME,BIRTH,DATA) values (:bm,:name,:birth,:blob)", -1, 0, &err);
assert(rc==_SUCCESS);
// 绑定变量
":bm", ODT_TEXT, 0, &p[0], &err);
assert(rc==_SUCCESS);
":name", ODT_TEXT, 100, &p[1], &err);
assert(rc==_SUCCESS);
":birth", ODT_DATE, 0, &p[2], &err);
assert(rc==_SUCCESS);
// 绑定BLOB变量
":blob", 0, &inbind, 0, &p[3], &err);
assert(rc==_SUCCESS);
// 设置变量的值
"2008", -1, &err);
"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);
}
//
// 主程序
//
int main(int argc, char* argv[])
{
insert_blob_data();
_CrtDumpMemoryLeaks();
return
}