如何读取Oracle的BLOB字段里的文件
下载源码:
http://download.csdn.net/source/589896
使用ORADBI读取存储在BLOB字段里的多个文件,并还原到指定的路径下。
下面是完整的代码:
- //
- // read_blobfile.c - 读BLOBFILE的例子
- // 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
- );
- ====================================================*/
- //
- // 显示如何把从BLOB字段读出数据并还原为文件
- //
- void select_blob_data()
- {
- lresult rc;
- ora_error_t err;
- ora_connection con = 0;
- ora_sqlstmt stmt = 0;
- ora_rowset rs = 0;
- ora_column col;
- ora_datetime odt;
- char *psz;
- char buf[30];
- char **pp_fnames = 0;
- ushort num_files = 0;
- ushort ui;
- // 创建连接
- rc = ORA_connection_create( &con, ORADB_SERVICE, ORADB_LOGUSER, ORADB_PASSWORD, OCI_THREADED|OCI_OBJECT, FALSE, &err);
- assert(rc==ORC_SUCCESS);
- // 创建SQL, 只取一行记录: where rownum<2
- rc = ORA_sqlstmt_create( &stmt, con, "select BM,NAME,BIRTH,DATA from TEST where rownum<2", -1, 0, &err );
- assert(rc==ORC_SUCCESS);
- // 执行选取
- rc = ORA_sqlstmt_select(stmt, MOD_DEFAULT, &rs, &err);
- assert(rc==ORC_SUCCESS);
- printf("/n BM NAME BIRTH DATA/n------------------------------------------------------/n");
- while (ORA_rowset_next(rs))
- {
- // BM
- col = ORA_rowset_get_column_by_index(rs, 1, &err);
- assert(ORA_column_not_null(col));
- ORA_column_as_string(col, &psz, &err);
- printf(" %s ", psz);
- // NAME
- col = ORA_rowset_get_column_by_index(rs, 2, &err);
- assert(ORA_column_not_null(col));
- ORA_column_as_string(col, &psz, &err);
- printf(" %s ", psz);
- // BIRTH
- col = ORA_rowset_get_column_by_index(rs, 3, &err);
- assert(ORA_column_not_null(col));
- ORA_column_as_datetime(col, &odt, &err);
- ORA_datetime_to_string(odt, "YYYY-MM-DD HH:UU:SS", buf, &err);
- printf(" %s ", buf);
- // DATA
- col = ORA_rowset_get_column_by_index(rs, 4, &err);
- assert(ORA_column_not_null(col));
- // 读取LOB字段数据, 写入文件:
- rc = ORA_column_read_lobfile(col, "c://temp", &pp_fnames, &num_files, &err);
- assert(rc==ORC_SUCCESS);
- for(ui=0; ui<num_files; ui++){
- printf("/n%s", pp_fnames[ui]);
- }
- ORA_string_list_free(pp_fnames, num_files);
- printf("/n");
- }
- // 释放
- ORA_rowset_free (rs);
- ORA_sqlstmt_free(stmt);
- ORA_connection_free(con);
- }
- //
- // 主程序
- //
- int main(int argc, char* argv[])
- {
- select_blob_data();
- _CrtDumpMemoryLeaks();
- return 0;
- }