OCISessionGet失败了Unicode

时间:2014-03-28 13:09:11

标签: oracle unicode utf-16 oci

我有以下代码用于连接正在按预期工作的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

1 个答案:

答案 0 :(得分:0)

也许是一个糟糕的Oracle文档,如果你看一下OciLogin2的dbname描述,你会发现这条信息

  

dbname必须采用上次调用OCIEnvNlsCreate()的charset参数指定的编码。

即使OCISessionGet 文档没有说明,我也猜测这就是这种情况,所以简短答案UTF编码你的tns字符串