基于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.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
#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,
INconstchar* service_name,
INconstchar* username,
INconstchar* password,
INulongenv_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,
INintsql_len,/*-1forstrlencalled*/
OUTora_error_t *error/*NULLfornoerrmsgreturn*/
);
/*prepares(andreturns)asqlstatementforexecution*/
lresultORADB_CALLORA_connection_prepare(
INora_connectionconnection,
IN constchar* sql_block,
INintsql_len,/*-1forstrlencalled*/
OUTora_sqlstmt *sqlstmt,/*asqlstatementforexecutionreturned*/
OUTora_error_t *error/*NULLfornoerrmsgreturn*/
);
/*executesaselectsqlstatementandreturntheresultset*/
lresultORADB_CALLORA_connection_select(
INora_connectionconnection,
IN constchar* sql_select,
INintsql_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,
INconstchar* sql_block,
INintsql_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,
INfloat 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,
INshortlen,/*-1forstrlencalled*/
OUTora_error_t *error/*NULLfornoerrmsgreturn*/
);
lresultORADB_CALLORA_param_set_bytes(
INora_paramparam,
IN constbyte* in_buf,
INushort 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,
OUTshort*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(
INconstchar*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 */
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,
INconstchar* service_name,
INconstchar* username,
INconstchar* password,
INulongenv_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,
INintsql_len,/*-1forstrlencalled*/
OUTora_error_t *error/*NULLfornoerrmsgreturn*/
);
/*prepares(andreturns)asqlstatementforexecution*/
lresultORADB_CALLORA_connection_prepare(
INora_connectionconnection,
IN constchar* sql_block,
INintsql_len,/*-1forstrlencalled*/
OUTora_sqlstmt *sqlstmt,/*asqlstatementforexecutionreturned*/
OUTora_error_t *error/*NULLfornoerrmsgreturn*/
);
/*executesaselectsqlstatementandreturntheresultset*/
lresultORADB_CALLORA_connection_select(
INora_connectionconnection,
IN constchar* sql_select,
INintsql_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,
INconstchar* sql_block,
INintsql_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,
INfloat 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,
INshortlen,/*-1forstrlencalled*/
OUTora_error_t *error/*NULLfornoerrmsgreturn*/
);
lresultORADB_CALLORA_param_set_bytes(
INora_paramparam,
IN constbyte* in_buf,
INushort 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,
OUTshort*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(
INconstchar*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 */
您可以在下面的链接中下载整个工程(包含测试一个项目),用VS2005(VC8)打开、编译。如果有任何问题,可以留言或发e-mail给我。