2014-03-28 21 views
0
失敗

我已經連接到正在按預期甲骨文XE DB下面的代碼:OCISessionGet使用Unicode

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

也許壞Oracle文檔的情況下,如果你看一下DBNAME爲OciLogin2的描述,你會發現這條信息

的dbname必須是在編碼由先前調用OCIEnvNlsCreate()的charset參數指定。

我在這裏猜測是這種情況,以及即使OCISessionGet文件沒有說明,所以簡短的回答UTF編碼TNS字符串

+0

謝謝回覆。將字符串轉換爲UTF16後,我得到** Error - ORA-12169:TNS:作爲連接標識符給出的Net服務名稱太長**。對於UTF-8,上面給出的TNS字符串是相同的字節。有任何想法嗎? – alienfromouterspace

+0

你如何做轉換? –

+0

爲utf16使用erlang unicode:charcters_to_binary/3然後將字節字符串加載到tns字符數組 – alienfromouterspace