2014-01-31 49 views
0

我的代碼行是沒有得到通過使用OCI代碼更新

UPDATE XXXX將狀態設置=: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; 
    } 

創建的語句句柄,準備語句,通過綁定列定位並執行失敗的查詢。

OCIStmtExecute()函數被調用時,控件正在消失,沒有返回任何值。 請讓我知道這個解決方案。

+0

如果失敗,你會看到一個錯誤,那它是什麼?如果您沒有看到錯誤,那麼它不會失敗,那麼問題是什麼?在成功執行OCIStatementExecute調用後,您還沒有顯示任何內容 - 您期望發生什麼? (爲什麼它應該執行3次?) –

+0

我修改了代碼,現在執行一次。我沒有收到任何錯誤或異常,但與此同時,數據庫中的值沒有得到更新。我的代碼中有任何問題,還是需要爲提交添加一些額外的代碼? – user3256190

+0

你有什麼代碼後,你已經表明它已經超過了執行?明確提交是一個好主意;我不確定這是否會隱含提交或回滾。但它是否乾淨地退出,還是轉儲核心 - 你能檢查可執行文件的返回代碼嗎? –

回答

0

the documentation

如果從Oracle數據庫的方式提出申請,斷開比 其他正常註銷,如丟失網絡連接,並 OCITransCommit()沒有被調用,所有活動的交易 自動回滾。

如果你不這樣做的explicit commit,而執行不通過OCI_COMMIT_ON_SUCCESS自動提交,那麼你的更新將在您退出應用程序回滾。

如果這是您的程序的結束,那麼您還應該看看this section about terminating,以便正確清理。