【问题标题】:OCISessionGet failing with UnicodeOCISessionGet 使用 Unicode 失败
【发布时间】:2014-03-28 13:09:10
【问题描述】:

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

【问题讨论】:

    标签: oracle unicode utf-16 oracle-call-interface


    【解决方案1】:

    可能是Oracle文档不好的情况,如果您查看OciLogin2的dbname的描述,您会发现这条信息

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

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

    【讨论】:

    • 感谢回复。将字符串转换为 UTF16 后,我收到 Error - ORA-12169: TNS:Net service name given as connect identifier is too long。对于 UTF-8,上面给出的 TNS 字符串是相同的字节。有什么想法吗?
    • 如何进行转换?
    • for utf16 使用 erlang unicode:charcters_to_binary/3 然后将字节字符串加载到 tns char 数组中
    • 你零终止字符串吗?即末尾的零字节
    • utf-8 和 ascii 字符串(在我的情况下它们是相同的)都是以零结尾的,只需检查一下即可。对于 UTF-16,我不知道如何附加零 byte 可能我需要添加 0x0000(或最后两个 0x00)——两者都试过了,没用,同样的错误
    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2018-11-28
    • 2018-06-03
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多