今天是值得紀念的一天!!

多年以來,我一直以為在非Unicode編碼ORACLE資料庫中正確塞入難字的唯一方法,只能透過OracleParameter...

手上有個應用,我寫的.NET程式要接收其他程式傳來的CommandText執行,而其中包含以N'...'方式新增難字內容的指令。無力改變這個協同運作方式,只能被逼著要解開這個謎團---到底要怎樣才能讓N'...'的難字正確送到ORACLE上執行呢?

不抱太大希望地在網路爬文,大概是多年來為了ORACLE Unicode問題煞費苦心孝感動天,老天爺忽然發了慈悲,讓我找到了解答: ORA_NCHAR_LITERAL_REPLACE!!

用一個範例來說明: 一如預期,MessageBox.Show時,"犇TEXT"中的"犇"字是不會出現的。

排版顯示純文字
private void Form1_Load(object sender, EventArgs e)
{
    string cnStr="Data Source=MyOracle;User Id=UserX;Password=PassX;Unicode=True";
    //設定ORA_NCHAR_LITERAL_REPLACE,這是CommandText中N'...'是否成功解譯的關鍵
    //System.Environment.SetEnvironmentVariable("ORA_NCHAR_LITERAL_REPLACE", "TRUE");
    using (OracleConnection cn = new OracleConnection(cnStr))
    {
        cn.Open();
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = cn;
        //建立測試資料表
        cmd.CommandText = "CREATE TABLE JEFFUNICODE (T NVARCHAR2(10))";
        cmd.ExecuteNonQuery();
        //以Parameter方式新增資料
        cmd.CommandText = "INSERT INTO JEFFUNICODE VALUES (:p1)";
        cmd.Parameters.Add("p1", OracleType.NVarChar).Value = "犇PARAM";
        cmd.ExecuteNonQuery();
        cmd.Parameters.Clear();
        //以純CommandText方式新增資料
        cmd.CommandText = "INSERT INTO JEFFUNICODE VALUES (N'犇TEXT')";
        cmd.ExecuteNonQuery();
        //將結果讀出來
        cmd.CommandText = "SELECT * FROM JEFFUNICODE";
        OracleDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
            MessageBox.Show(dr[0].ToString());
        //測試完畢,擦嘴閃人
        cmd.CommandText = "DROP TABLE JEFFUNICODE";
        cmd.ExecuteNonQuery();
        cn.Close();
    }
}

現在,讓我們加入神奇香料: 在開啟OracleConnection前,執行System.Environment.SetEnvironmentVariable("ORA_NCHAR_LITERAL_REPLACE", "TRUE");(注意: 一定要在開啟連線前設定才有效),重跑一次,"犇TEXT"居然就這麼顯示出來了!!

馬的! 我感動到快哭了。

分享給有類似困擾的朋友參考~


Comments

# by bobo

您好,請問一下,我也照著您上面的做法做,但總是會回我錯誤訊息「ORA-00917:遺漏逗號」,是不是還有哪邊要注意或設定的,才能成功呢?謝謝~

# by Jeffrey

to bobo, 看起來是Oracle無法正確解析你的SQL指令所致,可以試著調整SQL指令,例如: 先只INSERT更單純的TABLE、內容只用純英文或純數字,確定能正確執行,再逐步調整為你要執行動作,若加入某個東西後出錯,就可以鎖定它是問題來源,再去細究原因。

# by 阿翰

感動! 感動啊!

Post a comment