C语言 OCIStmtPrepare returns OCI_INVALID_HANDLE



我正在使用以下代码将D_1INSERT放入oracle表中。插入查询包含ÜÜ字符。

当我调用OCIStmtPrepare时,出现OCI_INVALID_HANDLE错误。这里可能有什么问题?

int executeINSERTQuery()
{
OCIEnv *envhp;
OCIError *errhp = NULL;
OCISvcCtx *svchp = NULL;
OCIExtProcContext *context=NULL;
int status = OCIEnvNlsCreate((OCIEnv **)&envhp,
(ub4)0, NULL, NULL, NULL, NULL, (size_t) 0, NULL,
(ub2)OCI_UTF16ID, (ub2)OCI_UTF16ID);
printf("Status: %dn", status);
const char sqlstr [300] = "INSERT INTO ABCD_TABLE VALUES('966','31-AUG-15','19-JAN-17','901','31-DEC-12','1','','','','','','','ÜÜcreatectare,ää')";
OCIStmt *stmthp;
printf("Statement: %sn", sqlstr);
status = OCIHandleAlloc((dvoid *)envhp, 
(dvoid **) &stmthp,
(ub4) OCI_HTYPE_STMT,  
(size_t) 0, 
(dvoid **) 0);

printf("OCIHandleAlloc: %dn", status);
status = OCIStmtPrepare (stmthp, errhp, (const text *) sqlstr, strlen(sqlstr), OCI_NTV_SYNTAX, OCI_DEFAULT);
if ( status != OCI_SUCCESS )
{
text errbuf[512];
sb4 errcode = 0;
switch (status)
{ 
case OCI_SUCCESS:
break;
case OCI_SUCCESS_WITH_INFO:
printf("ErrorOCI_SUCCESS_WITH_INFOn");
break;
case OCI_NEED_DATA:
printf("ErrorOCI_NEED_DATAn");
break;
case OCI_NO_DATA:
printf("ErrorOCI_NO_DATAn");
break;
case OCI_ERROR:
OCIErrorGet ((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode, errbuf, (ub4) sizeof(errbuf), (ub4) OCI_HTYPE_ERROR);
wprintf(L"Error : %S, Error Code: %dn", errbuf, errcode);
break;
case OCI_INVALID_HANDLE:
printf("Error OCI_INVALID_HANDLEn");
break;
default:
break;
}
}
printf("OCIStmtPrepare: %dn", status);
status = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)1, NULL, NULL, OCI_COMMIT_ON_SUCCESS) ;
printf("OCIExecute: %dn", status);
return status;
}

您正在初始化语句处理程序指针,但似乎没有初始化错误处理程序指针:

status = OCIHandleAlloc((dvoid *) envhp,
(dvoid **) &errhp,
(ub4) OCI_HTYPE_ERROR,
(size_t) 0,
(dvoid **) 0);

或者服务上下文指针:

status = OCIHandleAlloc((dvoid *) svchp,
(dvoid **) &errhp,
(ub4) OCI_HTYPE_SVCCTX,
(size_t) 0,
(dvoid **) 0);

不直接相关,但通常最好在inser语句中列出目标列:

INSERT INTO ABCD_TABLE(col1, col2, ...) VALUES(...)

如果您使用null而不是转义的空字符串,那么您的insert语句也会稍微更容易阅读(尽管''模式看起来很奇怪-难道不认为您需要转义这些字符串吗?-所以可能这不是目的);并且您依赖会话NLS设置来隐式转换日期值,这也不是一个好主意。无论如何,您确实应该绑定变量值,但这可能是您的下一步。

相关内容

  • 没有找到相关文章

最新更新