如何在oracle的blob字段里保存多个文件
2009-04-07 13:12:09 来源:WEB开发网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 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
#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 insert_blob_data()
{
lresult rc;
ora_error_t err; // 不需要释放
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之前调用
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, "insert into TEST (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);
}
//
// 主程序
//
int main(int argc, char* argv[])
{
insert_blob_data();
_CrtDumpMemoryLeaks();
return 0;
}
更多精彩
赞助商链接