2012-02-27 1640 views
0

我做从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

+1

你还有很长的路要走......你似乎有一堆是本地的函数处理的,但他们似乎没有在任何地方进行分配。首先我没有看到代码连接到服务器的一切都在这里,这就是你需要做的,有一个有意义的'OCISvcCtx.'我会建议你阅读到介绍到OCI编程文件,并采取一切演示的优势是什么oracle提供的代码,位于您链接到的文档的附录B中。 – Hoons 2012-02-27 21:23:39

+0

我想接受你的评论作为答案:)这是那些没有意义的名称(对我来说)的局部变量。请张贴它作为答案。谢谢! – Adrian 2012-02-27 21:50:12

回答

1

嗯......我看到,OCI处理其在本地定义没有被任何分配和/或正确初始化。如果这些步骤是在您继承的其他代码中完成的,则需要确保您有办法获取指向这些句柄的指针。如果没有,您连接到错误处理部分的Oracle文档对OCI编程有很好的介绍,并且深入的演示程序(您可能必须创建一个Oracle开发人员帐户并下载OCI客户端才能获取它们你不能到达某个地方)。祝你好运,在OCI是一个巨大的API,但Oracle自己的文档是伟大的,一旦你学会了如何通过它导航,比其他介绍我找到了OCI Relational functions section(至少是在10g中等价物)是无价的。

+0

我将它们实例化到别的地方,我不知道如何使用这些变量。解决的办法是外接变量,所以我可以使用实例化的变量。谢谢! – Adrian 2012-02-28 14:09:22