如题,先上代码,由于是试验~ 所以用了好多全局变量... 尽情的鄙视我吧...#include "oci.h"
#include <stdio.h>char db_error_info[2048];
OCIEnv *myenvhp;       /* the environment handle */
OCIServer *mysrvhp;    /* the server handle */
OCIError *myerrhp;     /* the error handle */
OCISession *myusrhp;   /* user session handle */
OCISvcCtx *mysvchp;    /* the  service handle */
OCIStmt *mystmt;
OCIBind *mybind;
OCIDefine *mydefine;
sb2 indb;void db_report_error()
{
    text msgbuf[512];
    sb4  errcode = 0;
    char buffer[128];    (void) OCIErrorGet((dvoid *) myerrhp, (ub4) 1, (text *) NULL, &errcode, msgbuf, (ub4) sizeof(msgbuf), (ub4) OCI_HTYPE_ERROR);
    if (errcode != 0)
    {
        sprintf(buffer, "ERROR_CODE :%d ", errcode);
        strcat(db_error_info, buffer);
        strcat(db_error_info, (char *)msgbuf); printf("%s\n", db_error_info);
    }
    return;
}int main()
{
  /* initialize the mode to be the threaded and object environment */
if( OCIEnvCreate(&myenvhp, OCI_THREADED|OCI_OBJECT, (dvoid *)0, 0, 0, 0, (size_t) 0, (dvoid **)0))
{
db_report_error();
return 1;
}
  /* allocate a server handle */
if( OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&mysrvhp, OCI_HTYPE_SERVER, 0, (dvoid **) 0))
{
db_report_error();
return 1;
}
  /* allocate an error handle */
if( OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&myerrhp, OCI_HTYPE_ERROR, 0, (dvoid **) 0))
{
db_report_error();
return 1;
}
  /* create a server context */
if( OCIServerAttach (mysrvhp, myerrhp, (text *)"intf", strlen ("intf"), OCI_DEFAULT))
{
db_report_error();
return 1;
}
  /* allocate a service handle */
if( OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&mysvchp, OCI_HTYPE_SVCCTX, 0, (dvoid **) 0))
{
db_report_error();
return 1;
}
  /* set the server attribute in the service context handle*/
if( OCIAttrSet ((dvoid *)mysvchp, OCI_HTYPE_SVCCTX, (dvoid *)mysrvhp, (ub4) 0, OCI_ATTR_SERVER, myerrhp))
{
db_report_error();
return 1;
}
          /* allocate a user session handle */
if( OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&myusrhp, OCI_HTYPE_SESSION, 0, (dvoid **) 0))
{
db_report_error();
return 1;
}
  /* set username attribute in user session handle */
if( OCIAttrSet ((dvoid *)myusrhp, OCI_HTYPE_SESSION, (dvoid *)"interface", (ub4)strlen("interface"), OCI_ATTR_USERNAME, myerrhp))
{
db_report_error();
return 1;
}
  /* set password attribute in user session handle */
if( OCIAttrSet ((dvoid *)myusrhp, OCI_HTYPE_SESSION, (dvoid *)"interface", (ub4)strlen("interface"), OCI_ATTR_PASSWORD, myerrhp))
{
db_report_error();
return 1;
}
  /* begin the session*/
if( OCISessionBegin ((dvoid *) mysvchp, myerrhp, myusrhp, OCI_CRED_RDBMS, OCI_DEFAULT))
{
db_report_error();
return 1;
}
  /* set the user session attribute in the service context handle*/
if( OCIAttrSet (  (dvoid *)mysvchp, OCI_HTYPE_SVCCTX, (dvoid *)myusrhp, (ub4) 0, OCI_ATTR_SESSION, myerrhp))
{
db_report_error();
return 1;
} /*------------------------------Excute SQL---------------------------*/ char selectSql[1000];
memset(selectSql, 0, sizeof(selectSql));
sprintf(selectSql, "select AAA from AAA where BBB = :bValue"); char aValue[10];
memset(aValue, 0, sizeof(aValue)); int bValue = 33; if(OCIStmtPrepare(mystmt, myerrhp, (text *)selectSql, (ub4)strlen(selectSql), (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT))   //这里报错了  但是我输出错误码和错误信息的时候竟然还是原来的值... 
{
printf("prepare failed: ");
//db_report_error();
text msgbuf[512];
                sb4  errcode = 0;
memset(msgbuf, 0, sizeof(msgbuf));
sprintf(msgbuf, "There is nothing wrong with it!!!\n"); (void) OCIErrorGet((dvoid *) myerrhp, (ub4) 1, (text *) NULL, &errcode, msgbuf, (ub4) sizeof(msgbuf), (ub4) OCI_HTYPE_ERROR); printf("error msg is [%s] and error code is [%d]\n", msgbuf, errcode); return 1;
} if(OCIBindByName(mystmt, &mybind, myerrhp, (text *)":bValue", -1, (dvoid *)bValue, (sword) sizeof(int), SQLT_INT, (dvoid *) &indb, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT))
{
printf("bind failed");
db_report_error();
return 2;
} if(OCIDefineByPos(mystmt, &mydefine, myerrhp, (ub4)1, (dvoid *) aValue, (sb4) sizeof(aValue), (ub2) SQLT_STR, (dvoid *) &indb, (ub2 *) 0, (ub2 *) 0, (ub4) OCI_DEFAULT))
{
printf("define failed");
db_report_error();
return 3;
} if(OCIStmtExecute(mysvchp, mystmt, myerrhp, (ub4) 1, (ub4) 0, 0, 0, (ub4) OCI_DEFAULT))
{
printf("execute failed");
db_report_error();
return 4;
} printf("sql excute finished... aValue is %s\n", aValue); return 0;
}问题是OCIStmtPrepare出错,原来的报错函数什么也没有输出,于是注释掉,填了同名的局部变量,然后直接调用OCIErrorGet,输出的竟然是我自己写的错误码和错误信息...请教各位大虾