gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:29:39 29 4
gpt4 key购买 nike

我有一个使用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com