我做從C到OCI到Oracle數據庫的幾個電話。OCI_INVALID_HANDLE - 無效的服務環境,連接或語句句柄
我得到這個錯誤:
OCI_INVALID_HANDLE - Invalid service context, connection or statement handle
我繼承了這個代碼:
initOracle(..) { .. //return successful or 0 }
int executeGetQuery(char * query, char * queryResultData) {
char stmt[255];
OCIError *errhp;
OCIDefine *defnp = (OCIDefine *) 0;
OCIStmt *stmthp;
OCISvcCtx *svchp; //server context handle (almost like DBPROCESS)
sb2 is_null;
memset((char *)stmt, 0, 255);
//TODO replace with query
sprintf((char *)stmt, "SELECT min(ID) as MINID FROM BNS_SAA_CONFIRMATIONS where SentToWssStatus<>'T'");
/* prepare statement */
if(checkerr(errhp, OCIStmtPrepare(stmthp, errhp, (text *) stmt,
(ub4) strlen((char *) stmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)) == OCI_ERROR)
return -1;
/* define output params */
if(checkerr(errhp, OCIDefineByPos(stmthp, &defnp, errhp, 1, (dvoid *) queryResultData,
(sword) strlen(queryResultData), SQLT_STR, (dvoid *) &is_null, (ub2 *)0,
(ub2 *)0, OCI_DEFAULT)) == OCI_ERROR)//maybe replace SQLT_STR w SQLT_CHR OMFWTD
return -1;
/* execute the statement */
status = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT);
....
}
我覺得這些功能的錯誤面:OCIStmtExecute(..)
或OCIDefineByPos(..)
或OCIStmtPrepare(..)
問題: 我該如何擺脫這個錯誤並開始執行查詢?
錯誤文檔:http://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci02bas.htm
你還有很長的路要走......你似乎有一堆是本地的函數處理的,但他們似乎沒有在任何地方進行分配。首先我沒有看到代碼連接到服務器的一切都在這裏,這就是你需要做的,有一個有意義的'OCISvcCtx.'我會建議你閱讀到介紹到OCI編程文件,並採取一切演示的優勢是什麼oracle提供的代碼,位於您鏈接到的文檔的附錄B中。 – Hoons 2012-02-27 21:23:39
我想接受你的評論作爲答案:)這是那些沒有意義的名稱(對我來說)的局部變量。請張貼它作爲答案。謝謝! – Adrian 2012-02-27 21:50:12