2016-03-01 55 views
1

我補充說,oracle database阿拉伯語字符集返回一個值的函數, 但是當我運行我的程序價值在文本框中顯示出來是這樣的c#文本框返回未知字符?

「敔璸潂X」中國人還是日本人性格

。要返回的值是阿拉伯字符。 我試圖將文本框更改爲從右到左,但它沒有幫助。 我試圖將存儲的值更改爲英文,但同一個字符正在返回。

有什麼建議嗎?

public void Get_Desc() 
{ 
    string oradb = "Data Source=schema;User Id=user;Password=pwd;"; 

    string CommandStr = "F_Get_Office_Desc"; 

    using (OracleConnection conn = new OracleConnection(oradb)) 
    using (OracleCommand cmd = new OracleCommand(CommandStr, conn)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.Add("iCode", OracleDbType.Varchar2).Value = Current_code; 
     cmd.Parameters.Add("oDesc", OracleDbType.Varchar2, 4).Direction = ParameterDirection.ReturnValue;     
     conn.Open(); 
     cmd.ExecuteNonQuery(); 

     Current_Desc.Text = cmd.Parameters["oDesc"].Value.ToString(); 
    } 
} 
+1

您正在使用錯誤的列類型,'VARCHAR2'不能表示阿拉伯語,請確保它的'NVARCHAR2'。 –

+1

當你的數據庫的字符集是'AL32UTF8'(或類似的),那麼'VARCHAR2'可以代表阿拉伯字符。 –

+1

你的環境變量'NLS_LANG'的價值是什麼?如果未設置,您的註冊表項「HKEY_LOCAL_MACHINE \ SOFTWARE \ ORACLE \ KEY_ {Oracle-Home} \ NLS_LANG」的值是多少? 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ORACLE \ {KEY_ Oracle的主頁} \ NLS_LANG'? –

回答

0

奇怪的是,通常Oracle.DataAccess.Client繼承了NLS_LANG值。你讀了哪個值?也許你閱讀32位值,但應用程序在64位上運行。

嘗試創建環境變量NLS_LANG=AMERICAN_AMERICA.AR8MSWIN1256,因爲環境值優先於所有其他設置。

也試試NLS_LANG=AMERICAN_AMERICA.AL32UTF8

在你的代碼添加

Console.WriteLine(conn.GetSessionInfo().ClientCharacterSet); 

打開連接後。什麼是輸出?

+0

實際上就像我評論在我使用環境變量AMERICAN_AMERICA.AR8MSWIN1256之前,我得到這個,因爲你問AR8MSWIN1256 ..嗯,我會嘗試我的應用程序在其他機器上工作在32位操作系統..順便說一句,如果64位工作在32位操作系統,然後將改變我的項目64位如果這能解決我的問題 – samer

+0

你的數據庫字符集是什麼?你也試過'NLS_LANG = AMERICAN_AMERICA.AL32UTF8'嗎?當你用'SELECT DUMP(F_Get_Office_Desc(...))FROM dual選擇值時,你會得到什麼?' –