现在的位置: 首页 > 综合 > 正文

如何读取Oracle的BLOB字段里的文件

2014年01月31日 ⁄ 综合 ⁄ 共 3206字 ⁄ 字号 评论关闭

 如何读取Oracle的BLOB字段里的文件

cheungmine@gmail.com

 

下载源码:

http://download.csdn.net/source/589896

 

 

使用ORADBI读取存储在BLOB字段里的多个文件,并还原到指定的路径下。

下面是完整的代码:

 

  1. //
  2. // read_blobfile.c - 读BLOBFILE的例子
  3. // cheungmine@gmail.com//
  4. // 内存泄漏检测
  5. // 在需要检测的地方放置语句:
  6. //        _CrtDumpMemoryLeaks();
  7. // 以下3句的次序不能改变
  8. #define _CRTDBG_MAP_ALLOC   
  9. #include<stdlib.h>
  10. #include<crtdbg.h>
  11. // 包含唯一的ORADBI 头文件
  12. #include "../oradbi.h"
  13. #ifdef _DEBUG
  14.     #pragma comment(lib, "../oradbi_dll/debug/oradbid.lib")
  15. #else
  16.     #pragma comment(lib, "../oradbi_dll/release/oradbi.lib")
  17. #endif
  18. #define ORADB_SERVICE   "CHEUNG"
  19. #define ORADB_LOGUSER   "mineusr"
  20. #define ORADB_PASSWORD  "minepwd"
  21. /*==================================================
  22. -- Create table
  23. create table TEST
  24. (
  25.   BM    VARCHAR2(10),
  26.   NAME  VARCHAR2(100),
  27.   BIRTH DATE,
  28.   DATA  BLOB
  29. )
  30. tablespace USERS
  31.   pctfree 10
  32.   initrans 1
  33.   maxtrans 255
  34.   storage
  35.   (
  36.     initial 64K
  37.     minextents 1
  38.     maxextents unlimited
  39.   );
  40. ====================================================*/
  41. //
  42. // 显示如何把从BLOB字段读出数据并还原为文件
  43. //
  44. void select_blob_data()
  45. {
  46.     lresult         rc;
  47.     ora_error_t     err;
  48.     ora_connection  con = 0;
  49.     ora_sqlstmt     stmt = 0;
  50.     ora_rowset      rs = 0;
  51.     ora_column      col;
  52.     ora_datetime    odt;
  53.     char           *psz;
  54.     char            buf[30];
  55.     char          **pp_fnames = 0;
  56.     ushort          num_files = 0;
  57.     ushort          ui;
  58.     
  59.     
  60.     // 创建连接
  61.     rc = ORA_connection_create( &con, ORADB_SERVICE, ORADB_LOGUSER, ORADB_PASSWORD, OCI_THREADED|OCI_OBJECT, FALSE, &err);
  62.     assert(rc==ORC_SUCCESS);
  63.     
  64.     // 创建SQL, 只取一行记录: where rownum<2
  65.     rc = ORA_sqlstmt_create( &stmt, con, "select BM,NAME,BIRTH,DATA from TEST where rownum<2", -1, 0, &err );
  66.     assert(rc==ORC_SUCCESS);
  67.         
  68.     // 执行选取
  69.     rc = ORA_sqlstmt_select(stmt, MOD_DEFAULT, &rs, &err);
  70.     assert(rc==ORC_SUCCESS);
  71.     printf("/n     BM          NAME         BIRTH          DATA/n------------------------------------------------------/n");
  72.     while (ORA_rowset_next(rs))
  73.     {
  74.         // BM
  75.         col = ORA_rowset_get_column_by_index(rs, 1, &err);
  76.         assert(ORA_column_not_null(col));
  77.         ORA_column_as_string(col, &psz, &err);
  78.         printf("  %s  ", psz);
  79.         // NAME
  80.         col = ORA_rowset_get_column_by_index(rs, 2, &err);
  81.         assert(ORA_column_not_null(col));
  82.         ORA_column_as_string(col, &psz, &err);
  83.         printf("  %s  ", psz);
  84.         // BIRTH
  85.         col = ORA_rowset_get_column_by_index(rs, 3, &err);
  86.         assert(ORA_column_not_null(col));
  87.         ORA_column_as_datetime(col, &odt, &err);
  88.         ORA_datetime_to_string(odt, "YYYY-MM-DD HH:UU:SS", buf, &err);
  89.         printf("  %s  ", buf);
  90.         // DATA
  91.         col = ORA_rowset_get_column_by_index(rs, 4, &err);
  92.         assert(ORA_column_not_null(col));
  93.         // 读取LOB字段数据, 写入文件:
  94.         rc = ORA_column_read_lobfile(col, "c://temp", &pp_fnames, &num_files, &err);
  95.         assert(rc==ORC_SUCCESS);
  96.         
  97.         for(ui=0; ui<num_files; ui++){
  98.             printf("/n%s", pp_fnames[ui]);      
  99.         }
  100.         ORA_string_list_free(pp_fnames, num_files);
  101.         printf("/n");
  102.     }
  103.     // 释放
  104.     ORA_rowset_free (rs);
  105.     ORA_sqlstmt_free(stmt);
  106.     ORA_connection_free(con);
  107. }
  108. //
  109. // 主程序
  110. //
  111. int main(int argc, char* argv[])
  112. {
  113.     select_blob_data();
  114.     _CrtDumpMemoryLeaks();
  115.     return 0;
  116. }

 

抱歉!评论已关闭.