讓OracleCommand.CommandText中N'...'正確被解讀
3 | 19,175 |
今天是值得紀念的一天!!
多年以來,我一直以為在非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 阿翰
感動! 感動啊!