c++ - 关于 setDataBuffer (OCCI) 包装器的实践

标签 c++ oracle wrapper

我有一个使用 OCCI Oracle API 访问数据库的 OracleConnection 类。我现在需要从数据库中获取多行记录,这是通过 API 的 ResultSet::getDataBuffer(...) 函数完成的。该函数接受一系列参数,其中一个参数是一个大枚举,它定义了可以包含的数据类型。

显然,我不想让我的应用程序代码中充斥着 Oracle API 类型,因此其他 API 可以与这个 API 互换。所以我的问题是如何最好地在我的函数包装器中使用这个 Type 参数?我应该只创建一个枚举并只采用我需要的类型,还是模板可以帮助我映射到我拥有的 OracleConnection 类中的 OCCI 枚举?

Occi setDataBuffer功能:

void setDataBuffer(
   unsigned int colIndex,
   void *buffer,
   Type type,
   sb4 size = 0,
   ub2 *length = NULL,
   sb2 *ind = NULL,
   ub2 *rc = NULL);

Type 这是一个如下所示的枚举:

enum Type
{
 OCCI_SQLT_CHR=SQLT_CHR,
 OCCI_SQLT_NUM=SQLT_NUM,
 OCCIINT = SQLT_INT,
 OCCIFLOAT = SQLT_FLT,
 OCCIBFLOAT = SQLT_BFLOAT,
 OCCIBDOUBLE = SQLT_BDOUBLE,
 OCCIIBFLOAT = SQLT_IBFLOAT,
 OCCIIBDOUBLE = SQLT_IBDOUBLE,
 OCCI_SQLT_STR=SQLT_STR,
 OCCI_SQLT_VNU=SQLT_VNU,
 OCCI_SQLT_PDN=SQLT_PDN,
 OCCI_SQLT_LNG=SQLT_LNG,
 OCCI_SQLT_VCS=SQLT_VCS,
.... (about 2x as many to go)

我的包装器如下所示:

void setDataBuffer(unsigned int colIndex, void * buffer, unsigned long size = 0, int type /*use int or template or redefine own Type Enum?*/,  unsigned short * length = NULL, signed short * ind = NULL, unsigned short * rc = NULL)

最佳答案

一个选择是让您的函数成为模板,然后使用特征类将模板类型转换为表示各种 Oracle 类型的值。

traits 类可能如下所示:

template <typename T>
struct oracle_type_traits;


template <> // create a specialization for each relevant type
struct oracle_type_traits<double> {
    static const value = OCCIBDOUBLE // its value member should be the value you want to map to
};

现在,下面将为您提供 double 的 Oracle 类型 ID :

oracle_type_traits<double>::value

内部 setDataBuffer<T>(...) ,你只要检查oracle_type_traits<T>::value获取相应的 Oracle 类型 ID。

关于c++ - 关于 setDataBuffer (OCCI) 包装器的实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5551330/

相关文章:

c++ - 避免散列函数中的严格别名冲突

c++ - 每次我知道我正在处理无符号值时,我都应该使用 "unsigned"吗?

oracle - 未在规范中声明就无法调用 Oracle 包函数

c++ - 为什么阻塞技术减少分支指令?

sql - ORA-01847 月份中的某一天必须介于 1 和月份最后一天之间 - 但数据正常

oracle - 为什么我的新用户可以在oracle中以sysdba登录?

java - 如何使用 Wrapper.exe 传递系统属性

C++ __usercall Hook

java - 为什么在使用带有原始类型和包装类的可变参数重载时会出现不明确的错误?

c++ - 'DLLVERSIONINFO' 将项目从 VS2008 更新到 VS2012 后出现编译错误