基于Oracle OCI的数据访问C语言接口ORADBI

基于Oracle OCI的数据访问C语言接口ORADBI
Mar. 22,2008
ORADBI是我在Oracle OCI(Oracle 调用接口)基础上开发的,支持Oracle8i、9i、10g等数据库。根据Oracle公司的介绍:OCI是如此可靠,以至于Oracle数据库中的每一条SQL语句都通过OCI来执行。当应用程序开发人员需要面向Oracle数据库服务器的最强大的接口时,他们将调用 Oracle调用接口(OCI)。OCI提供了对所有Oracle数据库功能的最全面的访问。OCI API中包含了最新的性能、可伸缩性和安全性特性。
采用OCI的最大好处就是:它是最切近Oracle底层的技术,因此,效率是最高的。同时,它是跨平台的。因此,在我给出的ORADBI库,除了OCI之外,没有其他外部依赖,稍加改动,就可以移植到非Windows平台上或其他嵌入式平台。
然而,OCI也比较不容易使用。它的功能之强,粒度之细,语法之烦琐,都不适合今天熟悉了快速开发模式的人员使用。然而,OCI的高效,直接根植于数据库核心,跨平台的语言特性,是其他如OO4O、OLEDB、ADO等COM方式不具备的。我最初开发Oralce数据库是4年以前,使用的是OO4O。直到最近,使用OCI成了我的爱好。于是,写了一套OCI的Helper库,方便OCI的使用。我不敢说是OCI的Wrapper库,因为我没能力包装OCI的方方面面。然而,我的ORADBI已经足够我(可能也包括你们)日常使用了。我就是用这套ORADBI操纵BLOB等大数据字段的。
公布这套ORADBI库,没有任何商业上的风险:我拥有这个库的全部版权,任何个人或团体可以为任何目的免费地、无限制地使用ORADBI库,前提是不能声明对ORADBI库的版权。对使用ORADBI库所造成的任何后果,我不负任何责任。如果这套软件对您的工作产生了很大的帮助,我不拒绝任何您的资助。
好了,让我们概览一下这个库,它包含下列文件:
.h文件.c文件
oradbi.h
* oradbi.c
oracol.horacol.c
oraconn.horaconn.c
oradate.horadate.c
oraerr.horaerr.c
oraparam.horaparam.c

orarows.horarows.c
orastmt.horastmt.c
oratype.h

unistd.h
list.h list.c
hashmap.hhashmap.c

其中,oradbi.h是你唯一需要包含的头文件。当把ORADBI作为动态库连接到你的工程里使用时,你在你的项目里加入类似下面的代码:

// test.cpp
#include " ../oradbi/oradbi.h "

#ifdef_DEBUG
#pragma comment(lib,"../oradbi/debug/oradbid.lib")
#else
#pragma comment(lib,"../oradbi/release/oradbi.lib")
#endif

下面是oradbi.h的全部内容:

/* ======================================================================
oradbi.h-Createdbycheungmine,Allrightsreserved.
First:Mar.8,2008
======================================================================
*/

#ifndefORADBI_H_INCLUDED
#defineORADBI_H_INCLUDED

#ifdef__cplusplus
extern"C" {
#endif


#ifdefORADBI_DLLEXPORT
#defineORADB_CALL__declspec(dllexport)
#defineORADB_CALL1(x)__declspec(dllexport)x
#endif

#ifndefORADB_CALL
#defineORADB_CALL
#endif

#ifndefORADB_CALL1
#defineORADB_CALL1(x)xORADB_CALL
#endif

/*NOTSUPPORTUNICODE*/
#ifdefUNICODE
#pragmamessage(__FILE__"WarningUNICODE:CannotuseUNICODE")
#endif

/*NOTSUPPORTUNICODE*/
#ifdef_UNICODE
#pragmamessage(__FILE__"WarningUNICODE:CannotuseUNICODE")
#endif

#include
"unistd.h"
#include
"oratype.h"
#include
"oraerr.h"

/* ======================================================================
connectionFunctions-oraconn.c
======================================================================
*/

/*connectstheapplicationtotheoracleserver.*/
lresultORADB_CALLORA_connection_create(
OUTora_connection
* connection,
IN
constchar*
service_name,
IN
constchar*
username,
IN
constchar*
password,
IN
ulongenv_mode,/*=OCI_THREADED|OCI_OBJECT*/

INBOOLnon_blocking_mode,
/*=FALSE*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*disconnectstheapplicationfromtheoracleserver.*/
void ORADB_CALLORA_connection_free(
INora_connectionconnection
);

/*executesasqlstatementwithnoresult*/

lresultORADB_CALLORA_connection_execute(
INora_connectionconnection,
IN
constchar* sql_block,
IN
intsql_len,/*-1forstrlencalled*/

OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*prepares(andreturns)asqlstatementforexecution*/
lresultORADB_CALLORA_connection_prepare(
INora_connectionconnection,
IN
constchar* sql_block,
IN
intsql_len,/*-1forstrlencalled*/

OUTora_sqlstmt
*sqlstmt,/*asqlstatementforexecutionreturned*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*executesaselectsqlstatementandreturntheresultset*/
lresultORADB_CALLORA_connection_select(
INora_connectionconnection,
IN
constchar* sql_select,
IN
intsql_len,/*-1forstrlencalled*/

OUTora_rowset
*rowset,/*theresultsetreturned*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*commitschanges*/
lresultORADB_CALLORA_connection_commit(
INora_connectionconnection,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*rollbackschanges*/
lresultORADB_CALLORA_connection_rollback(
INora_connectionconnection,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/* ======================================================================
sqlstmtFunctions-orastmt.c
======================================================================
*/

lresultORADB_CALLORA_sqlstmt_create(
OUTora_sqlstmt
* sqlstmt,
INora_connectionconnection,
IN
constchar*
sql_block,
IN
intsql_len,/*-1forstrlentobecalled*/

IN
ushortfetch_size,/*0fordefaultorbindarraysizeforINSERT*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

void ORADB_CALLORA_sqlstmt_free(
INora_sqlstmtsqlstmt
);

/*executesasqlstatementwithnooutputparameters*/

lresultORADB_CALLORA_sqlstmt_execute(
INora_sqlstmtsqlstmt,
INORADBI_ExecModemode,
/*executemode:MOD_DEFAULT=0*/
IN
ushortiters,/*0isdefault*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*executesaselectsqlstatementandreturnstheresultset*/
lresultORADB_CALLORA_sqlstmt_select(
INora_sqlstmtsqlstmt,
INORADBI_ExecModemode,
/*executemode:MOD_DEFAULT=0*/
OUTora_rowset
* rowset,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*bindsanamedvariabletosqlstmtbutforlob,whentypeissettoODT_UNKNOWNtypeistakenfromname'sprefix*/
lresultORADB_CALLORA_sqlstmt_bind(
INora_sqlstmtsqlstmt,
IN
constchar*name,/*paramnamebound*/
INORADBI_DataTypetype,
/*paramtypebound.setODT_UNKNOWNforsimplely.cannotbealobtype*/
IN
intsize,/*paramsizeforTEXT,LOB.0forothers*/
OUTora_param
*param,/*aoutparamboundtosqlstmt*/

OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*bindsanamedvariabletosqlstmtonlywithlobtype*/
lresultORADB_CALLORA_sqlstmt_bind_lob(
INora_sqlstmtsqlstmt,
IN
constchar*name,/*paramnamebound*/
IN
intmax_size,/*maximumsizeoflobdata,0fordefault.if0,client_datamustbeavalidpointer*/
INORADBI_InBind
*inbind,/*canbenull.ifnull,max_sizemustbeameaningfulvaluenotmorethan65535*/
INORADBI_OutBind
*outbind,/*canbenull*/
OUTora_param
*param,/*aoutparamboundtosqlstmt*/

OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*accessesparaminthesqlstmtbyname.getsareferencetoparam*/
ora_paramORADB_CALLORA_sqlstmt_get_param_by_name(
INora_sqlstmtsqlstmt,
IN
constchar*param_name,/*MUSTbeavalidnamestring*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*accessesparaminthesqlstmtbyindex:1-based.getsareferencetoparam*/
ora_paramORADB_CALLORA_sqlstmt_get_param_by_index(
INora_sqlstmtsqlstmt,
IN
ushortparam_index,/*PARAM_INDEX_BASEbased*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);


/* ======================================================================
rowsetFunctions-orarows.c
======================================================================
*/

/*returnsnumberofrowsfetchedsofar*/
lresultORADB_CALLORA_rowset_num_rows(
INora_rowsetrowset,
OUTsize_t
* num_rows,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnsnumberofcolumns*/
lresultORADB_CALLORA_rowset_num_columns(
INora_rowsetrowset,
OUTsize_t
* num_cols,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*fetchesnextrowofrecord.TRUEforNOTcompleted;FALSEforcompleted*/
BOOLORADB_CALLORA_rowset_next(
INora_rowsetrowset
);

/*freesaora_rowset.afreedrowsethandleisaninvalidpointerandcannotbeusedanymore*/
void ORADB_CALLORA_rowset_free(
INora_rowsetrowset
);

/*accessescolumninthecurrentrowbyname.getsareferencetocolumn*/

ora_columnORADB_CALLORA_rowset_get_column_by_name(
INora_rowsetrowset,
IN
constchar*col_name,/*MUSTbeavalidnamestring*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*accessescolumninthecurrentrowbyindex:1-based.getsareferencetocolumn*/
ora_columnORADB_CALLORA_rowset_get_column_by_index(
INora_rowsetrowset,
IN
ushortcol_index,/*COLUMN_INDEX_BASEbased*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/* ======================================================================
columnFunctions-oracol.c
======================================================================
*/

/*returnscolumndatatype*/
ORADB_CALL1(
constchar* )ORA_column_get_name(
INora_columncolumn
);

/*returnscolumndatatype*/

ORADBI_DataTypeORADB_CALLORA_column_get_type(
INora_columncolumn
);

/*returnscolumndisplaysize*/
size_tORADB_CALLORA_column_get_dispsize(
INora_columncolumn
);

/*returnscolumnprecisionofnumbericdatatype*/
int ORADB_CALLORA_column_get_precision(
INora_columncolumn
);

/*returnscolumnscaleofnumbericdatatype*/

int ORADB_CALLORA_column_get_scale(
INora_columncolumn
);

/*returnswhethercolumnisnullok*/

BOOLORADB_CALLORA_column_is_null_ok(
INora_columncolumn
);

/*returnswhethercolumnvalueisnull*/
BOOLORADB_CALLORA_column_is_null(
INora_columncolumn
);

/*returnscolumnvalueasstring*/
lresultORADB_CALLORA_column_as_string(
INora_columncolumn,
OUT
char**outval,/*Returnsaddressofpointertoactualdata*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnscolumnvalueasdouble*/
lresultORADB_CALLORA_column_as_double(
INora_columncolumn,
OUT
double* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnscolumnvalueasfloat32*/
lresultORADB_CALLORA_column_as_float(
INora_columncolumn,
OUT
float* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnscolumnvalueaslong*/
lresultORADB_CALLORA_column_as_long(
INora_columncolumn,
OUT
long* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnscolumnvalueasunsignedlong*/
lresultORADB_CALLORA_column_as_ulong(
INora_columncolumn,
OUT
ulong* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnscolumnvalueasint64*/
lresultORADB_CALLORA_column_as_longlong(
INora_columncolumn,
OUTlonglong
* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnscolumnvalueasuint64*/
lresultORADB_CALLORA_column_as_ulonglong(
INora_columncolumn,
OUTulonglong
* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnscolumnvalueasdatetime*/
lresultORADB_CALLORA_column_as_datetime(
INora_columncolumn,
OUTora_datetime
* outval,
OUTora_error_t
*
error
);


/*getslobsizeforread.ifacolumnisn'taLOBtypeorNULL,return0*/

size_tORADB_CALLORA_column_lob_size(
INora_columncolumn
);

/*readlobcolumnvalue-pullingmode*/
/* AnexampleofpullinglobdatawithORA_column_read_lob:
#defineBUFF_SIZE512

bytelob_buf[BUFF_SIZE];
lob_siz=ORA_column_lob_size(col);
lob_data=(byte*)malloc(lob_siz);
cb_offs=0;
cb_read=BUFF_SIZE;

while((rc=ORA_column_read_lob(col,lob_siz,cb_offs,lob_buf,&cb_read,&err))==ORC_NEED_DATA||rc==ORC_SUCCESS)
{
memcpy(lob_data+cb_offs,lob_buf,cb_read);
cb_offs+=cb_read;
if(rc==ORC_SUCCESS)
break;
cb_read=BUFF_SIZE;
}
ASSERT(cb_offs==lob_siz);
*/

lresultORADB_CALLORA_column_read_lob(
INora_columncolumn,
INsize_tlobsize_to_read,
/*totalbytestoread,usuallyislob_size*/
INsize_tcb_offset,
/*offsetbytesfromthestartoflobdata*/
INOUT
byte*in_buf,/*whenreturned,in_bufhasactualdata*/
INOUTsize_t
*cb_read,/*inputisbufsizeandoutputissizeofbytesberead*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);


/* returnslobcolumnvalueasbytesonceforall.out_bufisallocatedbycallerforfetchbytes.
*buf_sizeissizeofout_buf
*ORA_column_as_bytescallsORA_column_read_lobinternally.
*/

/* AnexampleofpullinglobdatawithORA_column_as_bytes:
size_tlob_size=ORA_column_lob_size(col);
byte*out_buf=malloc(lob_size);
ORA_column_as_bytes(col,out_buf,&lob_size,NULL);
...
free(out_buf);
*/

lresultORADB_CALLORA_column_as_bytes(
INora_columncolumn,
INOUT
byte* out_buf,
INOUTsize_t
*lob_size,/*sizebytesoflobdatawhichmust<=sizeofbuffer*/

OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/* ======================================================================
paramFunctions-oraparam.c
======================================================================
*/

ORADBI_DataTypeORADB_CALLORA_param_get_type(
INora_paramparam
);

lresultORADB_CALLORA_param_set_long(
INora_paramparam,
IN
long val,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

lresultORADB_CALLORA_param_set_ulong(
INora_paramparam,
IN
ulong val,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

lresultORADB_CALLORA_param_set_longlong(
INora_paramparam,
INlonglongval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_param_set_ulonglong(
INora_paramparam,
INulonglongval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_param_set_datetime(
INora_paramparam,
INora_datetimeval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

void ORADB_CALLORA_param_set_null(
INora_paramparam
);

lresultORADB_CALLORA_param_set_float(
INora_paramparam,
IN
float
val,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

lresultORADB_CALLORA_param_set_double(
INora_paramparam,
IN
double val,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

lresultORADB_CALLORA_param_set_string(
INora_paramparam,
IN
constchar* val,
IN
shortlen,/*-1forstrlencalled*/

OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_param_set_bytes(
INora_paramparam,
IN
constbyte* in_buf,
IN
ushort
size_buf,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

BOOLORADB_CALLORA_param_is_null(
INora_paramparam
);

/*returnscolumnvalueasstring*/
lresultORADB_CALLORA_param_as_string(
INora_paramparam,
OUT
char**outval,/*Returnsaddressofpointertoactualdata*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*returnsparamvalueasdouble*/
lresultORADB_CALLORA_param_as_double(
INora_paramparam,
OUT
double* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnsparamvalueasfloat32*/
lresultORADB_CALLORA_param_as_float(
INora_paramparam,
OUT
float* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnsparamvalueaslong*/
lresultORADB_CALLORA_param_as_long(
INora_paramparam,
OUT
long* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnsparamvalueasunsignedlong*/
lresultORADB_CALLORA_param_as_ulong(
INora_paramparam,
OUT
ulong* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnsparamvalueaslong*/
lresultORADB_CALLORA_param_as_longlong(
INora_paramparam,
OUTlonglong
* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnsparamvalueasunsignedlong*/
lresultORADB_CALLORA_param_as_ulonglong(
INora_paramparam,
OUTulonglong
* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnsparamvalueasdatetime*/
lresultORADB_CALLORA_param_as_datetime(
INora_paramparam,
OUTora_datetime
* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/*returnsparamvalueasrowset*/
lresultORADB_CALLORA_param_as_rowset(
INora_paramparam,
OUTora_rowset
* outval,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

/* ======================================================================
datetimeFunctions-oradate.c
======================================================================
*/

/*createsadatetimeopaquepointerwhichmustbefreeafterusing*/
lresultORADB_CALLORA_datetime_create(
OUTora_datetime
*dt/*mustbeavalidpointer*/
);

lresultORADB_CALLORA_datetime_set_all(
INora_datetimedt,
IN
shortyear,/*gregorianyear;rangeis-4712<=year<=9999*/
INORADBI_DTMonthmonth,
/*month;rangeis1<=month<12*/
IN
byteday,/*day;rangeis1<=day<=31*/
IN
bytehours,/*hours;rangeis0<=hours<=23*/
IN
byteminutes,/*minutes;rangeis0<=minutes<=59*/
IN
byteseconds,/*seconds;rangeis0<=seconds<=59*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

void ORADB_CALLORA_datetime_get_all(
INora_datetimedt,
OUT
short*year,/*gregorianyear;rangeis-4712<=year<=9999*/

OUTORADBI_DTMonth
*month,/*month;rangeis1<=month<12*/
OUT
byte*day,/*day;rangeis1<=day<=31*/
OUT
byte*hours,/*hours;rangeis0<=hours<=23*/
OUT
byte*minutes,/*minutes;rangeis0<=minutes<=59*/
OUT
byte*seconds/*seconds;rangeis0<=seconds<=59*/
);

lresultORADB_CALLORA_datetime_set_fld(
INora_datetimedt,
INORADBI_DTFielddt_field,
IN
short dt_val,
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/

);

short ORADB_CALLORA_datetime_get_fld(
INora_datetimedt,
INORADBI_DTFielddt_field
);

lresultORADB_CALLORA_string_to_datetime(
IN
constchar*dt_string,/*datetimestringsuchas:1975-08-1412:53:42*/

IN
char*dt_format,/*datetimeformatsuchas:yyyy-mm-ddhh:uu:ss*/
OUTora_datetimedt_to,
/*datetimethatstringtranslatedto*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

lresultORADB_CALLORA_datetime_to_string(
INora_datetimedt_in,
/*datetimetobetranslated*/
IN
char*dt_format,/*datetimeformatsuchas:yyyy-mm-ddhh:uu:ss*/
OUT
char*string_to,/*datetimestringsuchas:1975-08-1412:53:42*/
OUTora_error_t
*error/*NULLfornoerrmsgreturn*/
);

/*freesaora_datetime*/
void ORADB_CALLORA_datetime_free(
INora_datetimedt
);


#ifdef__cplusplus
}
#endif


/*====================================================================*/
#endif/*ndefORADBI_H_INCLUDED. cheungmine@gmail.com */

您可以在下面的链接中下载整个工程(包含测试一个项目),用VS2005VC8)打开、编译。如果有任何问题,可以留言或发e-mail给我。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值