使用OCI代码不会更新行

时间:2014-01-31 06:36:07

标签: oracle oci

我的代码

UPDATE XXXX SET status =:1其中ar_index =:2

//Allocate & initialize statement handle                   
    if (OCIHandleAlloc ((dvoid *)m_pOCIEnv,
                        (dvoid **)&m_pOCIStmt,
                        OCI_HTYPE_STMT,
                        (size_t)0,
                        (dvoid **)0) == OCI_ERROR)
    {
        strErrMsg = _T("Failed to allocate & initialize the statement handle : OCIHandleAlloc() failed");
        AfxMessageBox(strErrMsg.GetString());
        LOG_ALL(strErrMsg.GetString());
        return false;

    }

//prepare SQL statement for execution.
    if (OCIStmtPrepare(m_pOCIStmt, 
                       m_pOCIErr, 
                       pSqlStatement,                //SQL statement
                       strlen((char*)pSqlStatement), //SQL statement length
                       (ub4) OCI_NTV_SYNTAX, 
                       (ub4) OCI_DEFAULT) == OCI_ERROR)
    {
        strErrMsg = GetErrorMessage(m_pOCIErr);
        LOG_ALL (strErrMsg.GetString());
        return false;
    }


if (OCIBindByPos(m_pOCIStmt,
                              &m_pOCIBind,
                              m_pOCIErr,
                              1,
                              (void*)&p,
                              (sword)sizeof(p),
                              SQLT_STR,
                              NULL, NULL, NULL, NULL, NULL, OCI_DEFAULT) == OCI_ERROR)
            {
                strErrMsg = (GetErrorMessage(m_pOCIErr));
                LOG_ALL(strErrMsg.GetString());
                return false;
            }

            if (OCIBindByPos(m_pOCIStmt,
                              &m_pOCIBind,
                              m_pOCIErr,
                              2,
                              (void*)&m_uiArIndexValue,
                              (sword)sizeof(m_uiArIndexValue),
                              SQLT_UIN,
                              NULL, NULL, NULL, NULL, NULL, (ub4)OCI_DEFAULT) == OCI_ERROR)
            {
                strErrMsg = (GetErrorMessage(m_pOCIErr));
                LOG_ALL(strErrMsg.GetString());
                return false;
            }


//execute the SQL statement
    if (OCIStmtExecute(m_pOCISvc, 
                       m_pOCIStmt, 
                       m_pOCIErr, 
                       (ub4)3,  //number of times this statement will be executing 
                       (ub4)0,
                       NULL, 
                       NULL,  
                       (ub4)OCI_DEFAULT) == OCI_ERROR)
    {
        strErrMsg = GetErrorMessage(m_pOCIErr);
        LOG_ALL(strErrMsg.GetString());
        return false;
    }

创建一个Statement句柄,准备好语句,按位置绑定列并执行查询,这是失败的。

调用OCIStmtExecute()函数时,控件正在消失,不会返回任何值。 请让我知道解决方案。

1 个答案:

答案 0 :(得分:1)

来自the documentation

  

如果应用程序以不同于其他方式与Oracle数据库断开连接   正常注销,例如丢失网络连接,以及   尚未调用OCITransCommit(),所有活动事务都是   自动回滚。

如果您没有执行explicit commit,并且执行不会通过OCI_COMMIT_ON_SUCCESS自动提交,那么当您退出应用程序时,您的更新将会回滚。

如果这是程序的结束,那么您还应该查看this section about terminating,以便正确清理。