我的代码
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()
函数时,控件正在消失,不会返回任何值。
请让我知道解决方案。
答案 0 :(得分:1)
如果应用程序以不同于其他方式与Oracle数据库断开连接 正常注销,例如丢失网络连接,以及 尚未调用
OCITransCommit()
,所有活动事务都是 自动回滚。
如果您没有执行explicit commit,并且执行不会通过OCI_COMMIT_ON_SUCCESS
自动提交,那么当您退出应用程序时,您的更新将会回滚。
如果这是程序的结束,那么您还应该查看this section about terminating,以便正确清理。