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