手上有個應用,我寫的.NET程式要接收其他程式傳來的CommandText執行,而其中包含以N'...'方式新增難字內容的指令。無力改變這個協同運作方式,只能被逼著要解開這個謎團---到底要怎樣才能讓N'...'的難字正確送到ORACLE上執行呢?
不抱太大希望地在網路爬文,大概是多年來為了ORACLE Unicode問題煞費苦心孝感動天,老天爺忽然發了慈悲,讓我找到了解答: ORA_NCHAR_LITERAL_REPLACE!!
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"居然就這麼顯示出來了!!