基于Oracle OCI的数据访问C语言接口ORADBI .
oradbi.h* oradbi.c
oracol.h oracol.c
oraconn.h oraconn.c
oradate.h oradate.c
oraerr.h oraerr.c
oraparam.h oraparam.c
orarows.h orarows.c
orastmt.h orastmt.c
oratype.h
unistd.h
list.h list.c
hashmap.h hashmap.c
其中,oradbi.h是你唯一需要包含的头文件。当把ORADBI作为动态库连接到你的工程里使用时,你在你的项目里加入类似下面的代码:
#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 - Created by cheungmine, All rights reserved.
First : Mar. 8, 2008
======================================================================*/
#ifndef ORADBI_H_INCLUDED
#define ORADBI_H_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
#ifdef ORADBI_DLLEXPORT
# define ORADB_CALL __declspec(dllexport)
# define ORADB_CALL1(x) __declspec(dllexport) x
#endif
#ifndef ORADB_CALL
# define ORADB_CALL
#endif
#ifndef ORADB_CALL1
# define ORADB_CALL1(x) x ORADB_CALL
#endif
/* NOT SUPPORT UNICODE */
#ifdef UNICODE
#pragma message( __FILE__" Warning UNICODE: Cannot use UNICODE" )
#endif
/* NOT SUPPORT UNICODE */
#ifdef _UNICODE
#pragma message( __FILE__" Warning UNICODE: Cannot use UNICODE" )
#endif
#include "unistd.h"
#include "oratype.h"
#include "oraerr.h"
/*======================================================================
connection Functions - oraconn.c
======================================================================*/
/* connects the application to the oracle server. */
lresult ORADB_CALL ORA_connection_create (
OUT ora_connection *connection,
IN const char *service_name,
IN const char *username,
IN const char *password,
IN ulong env_mode, /* =OCI_THREADED|OCI_OBJECT */
IN BOOL non_blocking_mode, /* =FALSE */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* disconnects the application from the oracle server. */
void ORADB_CALL ORA_connection_free (
IN ora_connection connection
);
/* executes a sql statement with no result */
lresult ORADB_CALL ORA_connection_execute (
IN ora_connection connection,
IN const char *sql_block,
IN int sql_len, /* -1 for strlen called*/
OUT ora_error_t *error /* NULL for no err msg return */
);
/* prepares (and returns) a sql statement for execution */
lresult ORADB_CALL ORA_connection_prepare (
IN ora_connection connection,
IN const char *sql_block,
IN int sql_len, /* -1 for strlen called*/
OUT ora_sqlstmt *sqlstmt, /* a sql statement for execution returned */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* executes a select sql statement and return the result set */
lresult ORADB_CALL ORA_connection_select (
IN ora_connection connection,
IN const char *sql_select,
IN int sql_len, /* -1 for strlen called*/
OUT ora_rowset *rowset, /* the result set returned */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* commits changes */
lresult ORADB_CALL ORA_connection_commit (
IN ora_connection connection,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* rollbacks changes */
lresult ORADB_CALL ORA_connection_rollback (
IN ora_connection connection,
OUT ora_error_t *error /* NULL for no err msg return */
);
/*======================================================================
sqlstmt Functions - orastmt.c
======================================================================*/
lresult ORADB_CALL ORA_sqlstmt_create (
OUT ora_sqlstmt *sqlstmt,
IN ora_connection connection,
IN const char *sql_block,
IN int sql_len, /* -1 for strlen to be called*/
IN ushort fetch_size, /* 0 for default or bind array size for INSERT */
OUT ora_error_t *error /* NULL for no err msg return */
);
void ORADB_CALL ORA_sqlstmt_free (
IN ora_sqlstmt sqlstmt
);
/* executes a sql statement with no output parameters */
lresult ORADB_CALL ORA_sqlstmt_execute (
IN ora_sqlstmt sqlstmt,
IN ORADBI_ExecMode mode, /* execute mode: MOD_DEFAULT=0 */
IN ushort iters, /* 0 is default */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* executes a select sql statement and returns the result set */
lresult ORADB_CALL ORA_sqlstmt_select (
IN ora_sqlstmt sqlstmt,
IN ORADBI_ExecMode mode, /* execute mode: MOD_DEFAULT=0 */
OUT ora_rowset *rowset,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* binds a named variable to sqlstmt but for lob, when type is set to ODT_UNKNOWN type is taken from name's prefix */
lresult ORADB_CALL ORA_sqlstmt_bind (
IN ora_sqlstmt sqlstmt,
IN const char *name, /* param name bound */
IN ORADBI_DataType type, /* param type bound. set ODT_UNKNOWN for simplely. cannot be a lob type */
IN int size, /* param size for TEXT, LOB. 0 for others */
OUT ora_param *param, /* a out param bound to sqlstmt */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* binds a named variable to sqlstmt only with lob type */
lresult ORADB_CALL ORA_sqlstmt_bind_lob (
IN ora_sqlstmt sqlstmt,
IN const char *name, /* param name bound */
IN int max_size, /* maximum size of lob data, 0 for default. if 0, client_data must be a valid pointer */
IN ORADBI_InBind *inbind, /* can be null. if null, max_size must be a meaningful value not more than 65535 */
IN ORADBI_OutBind *outbind, /* can be null */
OUT ora_param *param, /* a out param bound to sqlstmt */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* accesses param in the sqlstmt by name. gets a reference to param */
ora_param ORADB_CALL ORA_sqlstmt_get_param_by_name (
IN ora_sqlstmt sqlstmt,
IN const char* param_name, /* MUST be a valid name string */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* accesses param in the sqlstmt by index: 1-based. gets a reference to param */
ora_param ORADB_CALL ORA_sqlstmt_get_param_by_index (
IN ora_sqlstmt sqlstmt,
IN ushort param_index, /* PARAM_INDEX_BASE based */
OUT ora_error_t *error /* NULL for no err msg return */
);
/*======================================================================
rowset Functions - orarows.c
======================================================================*/
/* returns number of rows fetched so far */
lresult ORADB_CALL ORA_rowset_num_rows (
IN ora_rowset rowset,
OUT size_t *num_rows,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns number of columns */
lresult ORADB_CALL ORA_rowset_num_columns (
IN ora_rowset rowset,
OUT size_t *num_cols,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* fetches next row of record. TRUE for NOT completed; FALSE for completed */
BOOL ORADB_CALL ORA_rowset_next (
IN ora_rowset rowset
);
/* frees a ora_rowset. a freed rowset handle is an invalid pointer and cannot be used any more */
void ORADB_CALL ORA_rowset_free (
IN ora_rowset rowset
);
/* accesses column in the current row by name. gets a reference to column */
ora_column ORADB_CALL ORA_rowset_get_column_by_name (
IN ora_rowset rowset,
IN const char* col_name, /* MUST be a valid name string */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* accesses column in the current row by index: 1-based. gets a reference to column */
ora_column ORADB_CALL ORA_rowset_get_column_by_index (
IN ora_rowset rowset,
IN ushort col_index, /* COLUMN_INDEX_BASE based */
OUT ora_error_t *error /* NULL for no err msg return */
);
/*======================================================================
column Functions - oracol.c
======================================================================*/
/* returns column data type */
ORADB_CALL1(const char*) ORA_column_get_name (
IN ora_column column
);
/* returns column data type */
ORADBI_DataType ORADB_CALL ORA_column_get_type (
IN ora_column column
);
/* returns column display size */
size_t ORADB_CALL ORA_column_get_dispsize (
IN ora_column column
);
/* returns column precision of numberic data type */
int ORADB_CALL ORA_column_get_precision (
IN ora_column column
);
/* returns column scale of numberic data type */
int ORADB_CALL ORA_column_get_scale (
IN ora_column column
);
/* returns whether column is null ok */
BOOL ORADB_CALL ORA_column_is_null_ok (
IN ora_column column
);
/* returns whether column value is null */
BOOL ORADB_CALL ORA_column_is_null (
IN ora_column column
);
/* returns column value as string */
lresult ORADB_CALL ORA_column_as_string (
IN ora_column column,
OUT char **outval, /* Returns address of pointer to actual data */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns column value as double */
lresult ORADB_CALL ORA_column_as_double (
IN ora_column column,
OUT double *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns column value as float32 */
lresult ORADB_CALL ORA_column_as_float (
IN ora_column column,
OUT float *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns column value as long */
lresult ORADB_CALL ORA_column_as_long (
IN ora_column column,
OUT long *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns column value as unsigned long */
lresult ORADB_CALL ORA_column_as_ulong (
IN ora_column column,
OUT ulong *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns column value as int64 */
lresult ORADB_CALL ORA_column_as_longlong (
IN ora_column column,
OUT longlong *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns column value as uint64 */
lresult ORADB_CALL ORA_column_as_ulonglong (
IN ora_column column,
OUT ulonglong *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns column value as datetime */
lresult ORADB_CALL ORA_column_as_datetime (
IN ora_column column,
OUT ora_datetime *outval,
OUT ora_error_t *error
);
/* gets lob size for read. if a column isn't a LOB type or NULL, return 0 */
size_t ORADB_CALL ORA_column_lob_size (
IN ora_column column
);
/* read lob column value - pulling mode */
/* An example of pulling lob data with ORA_column_read_lob:
#define BUFF_SIZE 512
byte lob_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);
*/
lresult ORADB_CALL ORA_column_read_lob (
IN ora_column column,
IN size_t lobsize_to_read, /* total bytes to read, usually is lob_size */
IN size_t cb_offset, /* offset bytes from the start of lob data */
INOUT byte* in_buf, /* when returned, in_buf has actual data */
INOUT size_t* cb_read, /* input is buf size and output is size of bytes be read */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns lob column value as bytes once for all. out_buf is allocated by caller for fetch bytes.
* buf_size is size of out_buf
* ORA_column_as_bytes calls ORA_column_read_lob internally.
*/
/* An example of pulling lob data with ORA_column_as_bytes:
size_t lob_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);
*/
lresult ORADB_CALL ORA_column_as_bytes (
IN ora_column column,
INOUT byte* out_buf,
INOUT size_t* lob_size, /* size bytes of lob data which must <= size of buffer */
OUT ora_error_t *error /* NULL for no err msg return */
);
/*======================================================================
param Functions - oraparam.c
======================================================================*/
ORADBI_DataType ORADB_CALL ORA_param_get_type (
IN ora_param param
);
lresult ORADB_CALL ORA_param_set_long (
IN ora_param param,
IN long val,
OUT ora_error_t *error /* NULL for no err msg return */
);
lresult ORADB_CALL ORA_param_set_ulong (
IN ora_param param,
IN ulong val,
OUT ora_error_t *error /* NULL for no err msg return */
);
lresult ORADB_CALL ORA_param_set_longlong (
IN ora_param param,
IN longlong val,
OUT ora_error_t *error /* NULL for no err msg return */
);
lresult ORADB_CALL ORA_param_set_ulonglong (
IN ora_param param,
IN ulonglong val,
OUT ora_error_t *error /* NULL for no err msg return */
);
lresult ORADB_CALL ORA_param_set_datetime (
IN ora_param param,
IN ora_datetime val,
OUT ora_error_t *error /* NULL for no err msg return */
);
void ORADB_CALL ORA_param_set_null (
IN ora_param param
);
lresult ORADB_CALL ORA_param_set_float (
IN ora_param param,
IN float val,
OUT ora_error_t *error /* NULL for no err msg return */
);
lresult ORADB_CALL ORA_param_set_double (
IN ora_param param,
IN double val,
OUT ora_error_t *error /* NULL for no err msg return */
);
lresult ORADB_CALL ORA_param_set_string (
IN ora_param param,
IN const char *val,
IN short len, /* -1 for strlen called */
OUT ora_error_t *error /* NULL for no err msg return */
);
lresult ORADB_CALL ORA_param_set_bytes (
IN ora_param param,
IN const byte *in_buf,
IN ushort size_buf,
OUT ora_error_t *error /* NULL for no err msg return */
);
BOOL ORADB_CALL ORA_param_is_null (
IN ora_param param
);
/* returns column value as string */
lresult ORADB_CALL ORA_param_as_string (
IN ora_param param,
OUT char **outval, /* Returns address of pointer to actual data */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns param value as double */
lresult ORADB_CALL ORA_param_as_double (
IN ora_param param,
OUT double *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns param value as float32 */
lresult ORADB_CALL ORA_param_as_float (
IN ora_param param,
OUT float *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns param value as long */
lresult ORADB_CALL ORA_param_as_long (
IN ora_param param,
OUT long *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns param value as unsigned long */
lresult ORADB_CALL ORA_param_as_ulong (
IN ora_param param,
OUT ulong *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns param value as long */
lresult ORADB_CALL ORA_param_as_longlong (
IN ora_param param,
OUT longlong *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns param value as unsigned long */
lresult ORADB_CALL ORA_param_as_ulonglong (
IN ora_param param,
OUT ulonglong *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns param value as datetime */
lresult ORADB_CALL ORA_param_as_datetime (
IN ora_param param,
OUT ora_datetime *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/* returns param value as rowset */
lresult ORADB_CALL ORA_param_as_rowset (
IN ora_param param,
OUT ora_rowset *outval,
OUT ora_error_t *error /* NULL for no err msg return */
);
/*======================================================================
datetime Functions - oradate.c
======================================================================*/
/* creates a datetime opaque pointer which must be free after using */
lresult ORADB_CALL ORA_datetime_create (
OUT ora_datetime *dt /* must be a valid pointer */
);
lresult ORADB_CALL ORA_datetime_set_all (
IN ora_datetime dt,
IN short year, /* gregorian year; range is -4712 <= year <= 9999 */
IN ORADBI_DTMonth month, /* month; range is 1 <= month < 12 */
IN byte day, /* day; range is 1 <= day <= 31 */
IN byte hours, /* hours; range is 0 <= hours <=23 */
IN byte minutes, /* minutes; range is 0 <= minutes <= 59 */
IN byte seconds, /* seconds; range is 0 <= seconds <= 59 */
OUT ora_error_t *error /* NULL for no err msg return */
);
void ORADB_CALL ORA_datetime_get_all (
IN ora_datetime dt,
OUT short *year, /* gregorian year; range is -4712 <= year <= 9999 */
OUT ORADBI_DTMonth *month, /* month; range is 1 <= month < 12 */
OUT byte *day, /* day; range is 1 <= day <= 31 */
OUT byte *hours, /* hours; range is 0 <= hours <=23 */
OUT byte *minutes, /* minutes; range is 0 <= minutes <= 59 */
OUT byte *seconds /* seconds; range is 0 <= seconds <= 59 */
);
lresult ORADB_CALL ORA_datetime_set_fld (
IN ora_datetime dt,
IN ORADBI_DTField dt_field,
IN short dt_val,
OUT ora_error_t *error /* NULL for no err msg return */
);
short ORADB_CALL ORA_datetime_get_fld (
IN ora_datetime dt,
IN ORADBI_DTField dt_field
);
lresult ORADB_CALL ORA_string_to_datetime (
IN const char *dt_string, /* datetime string such as: 1975-08-14 12:53:42 */
IN char *dt_format, /* datetime format such as: yyyy-mm-dd hh:uu:ss */
OUT ora_datetime dt_to, /* datetime that string translated to */
OUT ora_error_t *error /* NULL for no err msg return */
);
lresult ORADB_CALL ORA_datetime_to_string (
IN ora_datetime dt_in, /* datetime to be translated */
IN char *dt_format, /* datetime format such as: yyyy-mm-dd hh:uu:ss */
OUT char *string_to, /* datetime string such as: 1975-08-14 12:53:42 */
OUT ora_error_t *error /* NULL for no err msg return */
);
/* frees a ora_datetime */
void ORADB_CALL ORA_datetime_free (
IN ora_datetime dt
);
#ifdef __cplusplus
}
#endif
/*====================================================================*/
#endif /* ndef ORADBI_H_INCLUDED . cheungmine@gmail.com */
您可以在下面的链接中下载整个工程(包含测试一个项目),用VS2005(VC8)打开、编译。如果有任何问题,可以留言或发e-mail给我。
http://download.csdn.net/source/399444
基于Oracle OCI的数据访问C语言接口ORADBI .的更多相关文章
- 数据访问层的接口IBaseDAL
using System; using System.Collections; using System.Data; using System.Data.Common; using System.Co ...
- MyBatis框架的XML数据访问Dao层接口的组合使用
MyBatis 的前生为Apache的开源项目iBatis.其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口.目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql ...
- Dojo Data Store——统一数据访问接口
原文地址:http://www.infoq.com/cn/articles/wq-dojo-data-store 无论在传统的桌面应用还是在主流的互联网应用中,数据始终占据着软件应用中的核心地位.当下 ...
- 支持SQL Server数据库又支持MongoDB数据库的数据访问设计
网站整体架构建议采用工厂模式 分别包括:数据访问层DAL,数据访问接口层IDAL,工厂层DALFactory,业务逻辑层,显示层这样的架构方式 在WebConfig配置采用何种数据库的数据访问层 &l ...
- servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因
package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...
- 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据
package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...
- 【转】在Spring中基于JDBC进行数据访问时怎么控制超时
http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...
- ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relatio ...
- 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理
我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...
随机推荐
- Jquery插件的编写和使用
第七章 Jquery插件的编写和使用 插件的定义: 插件也称为扩展,是一种遵循一定规范的应用程序接口编写出来的程序. 下面是Jquery插件的编写很使用:要查看请点击:Jquery插件的编写很使 ...
- Error This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. T
错误提示: Severity Code Description Project File Line Suppression StateError This project references NuG ...
- Contoso 大学 - 1 - 为 ASP.NET MVC 应用程序创建 EF 数据模型
原文 Contoso 大学 - 1 - 为 ASP.NET MVC 应用程序创建 EF 数据模型 原文地址:Creating an Entity Framework Data Model for an ...
- IOS UITabelView的cell
一.Cell的重用原理 iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存.要解决该问题,需要重用 ...
- XML中的Xpath解析的例子
/*XPath 术语节点(Node)在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档(根)节点.XML 文档是被作为节点树来对待的.树的根被称为文档节点或者根节 ...
- ftp上传java代码
<欢迎转载http://www.cnblogs.com/shizhongtao/p/3345826.html> 上传代码就写个简单的小例子.首先要加入jar包.commons-net-1. ...
- 正则应用—queryURLParameter()
在项目中,我们做详情页的时候,需要获取到用户从哪里来点击进来,获取到用户的点击地址,根据不同的地址传进的参数向服务器获取不同的数据,然后加载不同的详情页面. 大部分企业都采用字符串截取的方式,quer ...
- 就要从SDG离职了
在知乎上看到有个提问,你为什么从盛大离职.我八月份在盛大游戏实习之间,下个星期准备辞职迎接新的挑战.本文也将提到我在盛大实习的经历以及离职的原因.当然,不会涉及很多SDG内部的管理以及技术上的秘密. ...
- 大型网站用什么技术比较好,JSP,PHP,ASP.NET
大型网站,我建议要考虑的问题: 首先讨论一下大型网站需要注意和考虑的问题. 数据库海量数据处理:负载量不大的情况下select.delete和update是响应很迅速的,最多加几个索引就可以搞定,但千 ...
- WPF中Expander控件样式,ListBox的样式(带checkbox)恢复
Expander控件样式: <ControlTemplate x:Key="ExpanderToggleButton" TargetType="ToggleButt ...