日期:2014-05-17  浏览次数:20937 次

关于OCI的OCIStmtExecute()问题

 void main()
{
OCIEnvCreate(&myenvhp, OCI_THREADED|OCI_OBJECT, (dvoid *)0,
0, 0, 0, (size_t) 0, (dvoid **)0);

OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&mysrvhp,
OCI_HTYPE_SERVER, 0, (dvoid **) 0);

OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&myerrhp,
OCI_HTYPE_ERROR, 0, (dvoid **) 0);

if (OCIServerAttach (mysrvhp, myerrhp, (text *)"orcl",
strlen ("orcl"), OCI_DEFAULT) == OCI_SUCCESS)
MessageBox("1!\n");
else
{
MessageBox("2!\n");
//return -1;
}

OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&mysvchp,
OCI_HTYPE_SVCCTX, 0, (dvoid **) 0);

OCIAttrSet ((dvoid *)mysvchp, OCI_HTYPE_SVCCTX,
(dvoid *)mysrvhp, (ub4) 0, OCI_ATTR_SERVER, myerrhp);

OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&myusrhp,
OCI_HTYPE_SESSION, 0, (dvoid **) 0);

OCIAttrSet ((dvoid *)myusrhp, OCI_HTYPE_SESSION,
(dvoid *)"lsqsql", (ub4)strlen("lsqsql"),
OCI_ATTR_USERNAME, myerrhp);
OCIAttrSet ((dvoid *)myusrhp, OCI_HTYPE_SESSION,
(dvoid *)"123456", (ub4)strlen("123456"),
OCI_ATTR_PASSWORD, myerrhp);
if (OCISessionBegin ((OCISvcCtx *) mysvchp, myerrhp, myusrhp,
OCI_CRED_RDBMS, OCI_DEFAULT) == OCI_SUCCESS)
{
MessageBox("3!\n");
}
else
{
MessageBox("4\n");
// return -1;
}
text* create1 = (text*)"create table georaster_table(georid number primary key, type varchar2(32), georaster mdsys.sdo_georaster)";
sb4 status = 0;
OCIAttrSet ( (dvoid *)mysvchp, OCI_HTYPE_SVCCTX,
(dvoid *)myusrhp, (ub4) 0, OCI_ATTR_SESSION, myerrhp);
int tt=CheckErr(myerrhp, OCIHandleAlloc(myenvhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, 0));
int cc=CheckErr(myerrhp, OCIStmtPrepare(stmthp, myerrhp, create1, strlen((char*)create1),
OCI_NTV_SYNTAX, OCI_DEFAULT));
status = OCIStmtExecute(mysvchp, stmthp, myerrhp, 1, 0, NULL, NULL,
OCI_DEFAULT|OCI_COMMIT_ON_SUCCESS|OCI_BATCH_ERRORS);

if (status && status != OCI_SUCCESS_WITH_INFO)
{
OCIHandleFree((dvoid*)myenvhp, OCI_HTYPE_ENV);

return ;
}

}
在执行status=OCIStmtExecute(mysvchp, stmthp, myerrhp, 1, 0, NULL, NULL,
OCI_DEFAULT|OCI_COMMIT_ON_SUCCESS|OCI_BATCH_ERRORS);这句代码之前都没有任何问题,此时status=-1,请教各位大虾,这是什么问题?谢谢了!

------解决方案--------------------
改成:status=OCIStmtExecute(mysvchp, stmthp, myerrhp, 1, 0, NULL, NULL,
OCI_DEFAULT)呢?
如果status等于-1,把error信息打出来就知道是什么错了。
给一个类似的出错信息伪码:
switch (status)
{
case OCI_SUCCESS:
break;
case OCI_SUCCESS_WITH_INFO:
break;
case OCI_NEED_DATA:
throw DBException(file, line, "Error - OCI_NEED_DATA\n");
break;
case OCI_NO_DATA:
throw DBException(file, line, "Error - OCI_NODATA\n");
break;
case OCI_ERROR:
{
char buf[1024];
(void) o->OCIErrorGet_f((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,
(text*)buf, (ub4) sizeof(buf), OCI_HTYPE_ERROR);
throw DBException(file, line, buf);
break;
}
case OCI_INVALID_HANDLE:
throw DBException(file, line, "Error - OCI_INVALID_HANDLE\n");
break;
case OCI_STILL_EXECUTING:
throw DBException(file, line, "Error - OCI_STILL_EXECUTE\n");
break;
case OCI_CONTINUE:
throw DBException(file, line, "Error - OCI_CONTINUE\n");
break;
default:
break;
}