0

我正在使用 OCI 开发 C++ 应用程序。我需要从数据库中获取数据到 OCINumber。我对如何将 OCIDefineByPos() 函数与 OCINumbers 一起使用感到困惑。有人可以帮我弄这个吗。

下面给出的是我调用 OCIDefineByPos 函数的代码部分。pStmt 是 OCIStmt*,p_Error 是 OCIError*。使用以下函数指针。

1. pf_OCINumberFromReal = function pointer to OCINumberFromReal
2. pf_OCINumberToReal  = function pointer to OCINumberToReal
3. pf_DefineByPos = function pointer to OCIDefineByPos.

OCINumber ocinTest;
long double dnum = 0.0;

(*pf_OCINumberFromReal)(p_Error, &dnum, sizeof(dnum), &ocinTest);
int iLength1 = sizeof(ocinTest);


OCIDefine* pDfn = NULL;
iRet = (*pf_DefineByPos)(pStmt, &pDfn, p_Error, 1, (dvoid *) &ocinTest,
    (sword) iLength1, SQLT_NUM, (dvoid *) 0, (ub2 *)0,
        (ub2 *)0, OCI_DEFAULT);
if (iRet == OCI_SUCCESS)
{
    (*pf_OCINumberToReal)(p_Error, &ocinTest, sizeof(dnum), &dnum);
    std::cout <<std::fixed << std::setprecision (10) << dnum << std::endl;
}

尽管 iRet = OCI_SUCCESS 它没有正确获取数据库中的值。(使用 pStmt 定义的 sql 查询的值)。即使在通话之后,dnum 也是 0.0。这个 pf_DefineByPos 适用于其他数据类型,例如 int 、double 等。

所以有人可以帮我找到这个问题。

4

2 回答 2

0

如果您的代码没有完全脱离上下文,那么您缺少几个基本部分。

典型的 OCI 程序包括以下步骤:

  1. 准备 SQL 语句 (OCIStmtPrepare)

  2. 将结果列或输出参数绑定到将接收结果值的变量 (OCIDefineByPos)

  3. 执行语句 (OCIStmtExecute)

  4. 对结果做点什么

在我看来,您正在跳过第 3 步,并在第 2 步之后期待一些结果。但是第 2 步没有获取任何数据。它只是在查询结果和您的变量之间创建关联。

于 2012-08-29T12:19:23.347 回答
0

你需要DefineByPosfor OCINumberwith SQLT_VNUtype 而不是SQLT_NUM.

于 2013-12-30T23:08:41.373 回答