我有以下代码用于连接正在按预期工作的Oracle-XE DB:
const char
*tns = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)
(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=XE)))",
*usr = "scott",
*pwd = "tiger";
err = OCIEnvNlsCreate(&envhp,OCI_THREADED, NULL, NULL, NULL, NULL, (size_t) 0
, (void**) NULL, 0, 0);
if(err != OCI_SUCCESS) return true;
err = OCIHandleAlloc(envhp, (void **) &errhp, OCI_HTYPE_ERROR, (size_t) 0
, (void **) NULL);
if(err != OCI_SUCCESS) return true;
err = OCIHandleAlloc(envhp,(void**)&authp, OCI_HTYPE_AUTHINFO,(size_t)0
, (void **) NULL);
if(err != OCI_SUCCESS) return true;
err = OCIAttrSet(authp, OCI_HTYPE_AUTHINFO,(void*) usr,
(ub4)strlen(usr),OCI_ATTR_USERNAME, (OCIError *)errhp);
if(err != OCI_SUCCESS) return true;
err = OCIAttrSet(authp, OCI_HTYPE_AUTHINFO,(void*) pwd,
(ub4)strlen(pwd),OCI_ATTR_PASSWORD, (OCIError *)errhp);
if(err != OCI_SUCCESS) return true;
err = OCISessionGet(envhp, errhp, &svchp, authp, (OraText*) tns,
(ub4)strlen(tns), NULL, 0, NULL, NULL, NULL, OCI_DEFAULT);
if(err != OCI_SUCCESS) {
checkerr(errhp, err, __LINE__);
return true;
}
现在我想支持unicode,我改变了以下内容:
err = OCIEnvNlsCreate(&envhp,OCI_THREADED, NULL, NULL, NULL, NULL, (size_t) 0,
(void**) NULL, OCI_UTF16ID, OCI_UTF16ID);
现在我在OCISessionGet获得ORA-12154,所以它不再连接了。我做错了什么?
TIA
答案 0 :(得分:0)
也许是一个糟糕的Oracle文档,如果你看一下OciLogin2的dbname描述,你会发现这条信息
dbname必须采用上次调用OCIEnvNlsCreate()的charset参数指定的编码。
即使OCISessionGet 文档没有说明,我也猜测这就是这种情况,所以简短答案UTF编码你的tns字符串。