如何在oracle的blob字段里保存多个文件

如何在oracleblob字段里保存多个文件

<?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" />

OracleBLOB字段类型可以用来保存长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++//CC++中的异常处理.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字段的完整的例子:

  1. //
  2. //write_blobfile.c-写BLOBFILE的例子
  3. //使用ORADBI.dll
  4. //cheungmine@gmail.com,保留所有权利
  5. //
  6. //内存泄漏检测
  7. //在需要检测的地方放置语句:
  8. //_CrtDumpMemoryLeaks();
  9. //以下3句的次序不能改变
  10. #define_CRTDBG_MAP_ALLOC
  11. #include<stdlib.h>
  12. #include<crtdbg.h>
  13. //包含唯一的ORADBI头文件
  14. #include"../oradbi.h"
  15. #ifdef_DEBUG
  16. #pragmacomment(lib,"../oradbi_dll/debug/oradbid.lib")
  17. #else
  18. #pragmacomment(lib,"../oradbi_dll/release/oradbi.lib")
  19. #endif
  20. #defineORADB_SERVICE"CHEUNG"
  21. #defineORADB_LOGUSER"mineusr"
  22. #defineORADB_PASSWORD"minepwd"
  23. /*==================================================
  24. --Createtable
  25. createtableTEST
  26. (
  27. BMVARCHAR2(10),
  28. NAMEVARCHAR2(100),
  29. BIRTHDATE,
  30. DATABLOB
  31. )
  32. tablespaceUSERS
  33. pctfree10
  34. initrans1
  35. maxtrans255
  36. storage
  37. (
  38. initial64K
  39. minextents1
  40. maxextentsunlimited
  41. );
  42. ====================================================*/
  43. //
  44. //下面的文件被插入到一个DATA字段
  45. //在这里定义你要插入的文件,这些文件必须存在
  46. //
  47. constchar*arrLobFiles[]={
  48. "E://eBookLib-计算机//C&C++//APress.CryptographyinCandC++_SourceCode.rar",
  49. "E://eBookLib-计算机//C&C++//Charles.River.Media.Algorithms.For.Compiler.Design.eBook-LiB.chm",
  50. "E://eBookLib-计算机//C&C++//C与C++中的异常处理.pdf",
  51. "E://eBookLib-计算机//C&C++//Theartofassmeblylanguage.pdf",
  52. "E://eBookLib-计算机//C&C++//Jones.And.Bartlett.Publishers.Foundations.Of.Algorithms.Using.Cpp.Pseudocode.3rd.Edition.eBook-Li.chm",
  53. "E://eBookLib-计算机//C&C++//TheC++StandardLibrary.pdf",
  54. "E://eBookLib-计算机//C&C++//GCC--CompleteReference.pdf",
  55. "E://eBookLib-计算机//C&C++//VC技术内幕第五版.chm",
  56. "E://eBookLib-计算机//Network&Tcpip//ALTHOS.Introduction.To.Data.Networks.PDN.LAN.MAN.WAN.and.Wireless.Data.Technologies.and.Systems.e.chm",
  57. "E://eBookLib-计算机//Network&Tcpip//DigitalSatelliteCommunications2ndEd-book.pdf",
  58. "E://eBookLib-计算机//Network&Tcpip//McGraw.Hill.Storage.Networks.The.Complete.Reference.chm",
  59. "E://eBookLib-计算机//Network&Tcpip//UNIXNetworkProgrammingVolume1_3rdEdition-TheSocketsNetworkingAPI.chm"
  60. };
  61. //
  62. //显示如何把多个文件插入到BLOB字段
  63. //
  64. voidinsert_blob_data()
  65. {
  66. lresultrc;
  67. ora_error_terr;//不需要释放
  68. ora_paramp[4];
  69. ora_datetimedt;
  70. ora_connectioncon=0;
  71. ora_sqlstmtstmt=0;
  72. //用于绑定LOB变量的结构
  73. ORADBI_InBindinbind;
  74. //利用ORADBI自带的写blobfile功能
  75. //ORA_inbind_lobfile_init必须在ORA_sqlstmt_bind_lob之前调用
  76. ORA_inbind_lobfile_init(&inbind,0,arrLobFiles,sizeof(arrLobFiles)/sizeof(arrLobFiles[0]),&err);
  77. //创建连接
  78. rc=ORA_connection_create(&con,ORADB_SERVICE,ORADB_LOGUSER,ORADB_PASSWORD,OCI_THREADED|OCI_OBJECT,FALSE,&err);
  79. assert(rc==_SUCCESS);
  80. //创建SQL
  81. rc=ORA_sqlstmt_create(&stmt,con,"insertintoTEST(BM,NAME,BIRTH,DATA)values(:bm,:name,:birth,:blob)",-1,0,&err);
  82. assert(rc==_SUCCESS);
  83. //绑定变量
  84. rc=ORA_sqlstmt_bind(stmt,":bm",ODT_TEXT,0,&p[0],&err);
  85. assert(rc==_SUCCESS);
  86. rc=ORA_sqlstmt_bind(stmt,":name",ODT_TEXT,100,&p[1],&err);
  87. assert(rc==_SUCCESS);
  88. rc=ORA_sqlstmt_bind(stmt,":birth",ODT_DATE,0,&p[2],&err);
  89. assert(rc==_SUCCESS);
  90. //绑定BLOB变量
  91. rc=ORA_sqlstmt_bind_lob(stmt,":blob",0,&inbind,0,&p[3],&err);
  92. assert(rc==_SUCCESS);
  93. //设置变量的值
  94. rc=ORA_param_set_string(p[0],"2008",-1,&err);
  95. rc=ORA_param_set_string(p[1],"BeiJing",-1,&err);
  96. ORA_datetime_create(&dt,1);
  97. rc=ORA_param_set_datetime(p[2],dt,&err);
  98. ORA_datetime_free(dt);
  99. //执行插入
  100. rc=ORA_sqlstmt_execute(stmt,MOD_DEFAULT,0,&err);
  101. assert(rc==_SUCCESS);
  102. rc=ORA_connection_commit(con,&err);
  103. assert(rc==_SUCCESS);
  104. //释放结束
  105. ORA_inbind_lobfile_free(&inbind);
  106. ORA_sqlstmt_free(stmt);
  107. ORA_connection_free(con);
  108. }
  109. //
  110. //主程序
  111. //
  112. intmain(intargc,char*argv[])
  113. {
  114. insert_blob_data();
  115. _CrtDumpMemoryLeaks();
  116. return0;
  117. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值