上回我們破解過"用ADO.NET讀取ORACLE VARCHAR中的BIG5罕用字",今天又有人出了難題--如何將BIG5罕用字寫入ORACLE VARCHAR2欄位?

經實驗,單純用cmd.Parameters.Add("param", OracleType.VarChar).Value="含罕用字/造字的字串",則所有的罕字與造字在資料表中會變成問號。我猜與讀取時面對的問題完全相同,資料從網路接收到OracleClient解析完成的過程中,某段沒見過世面的冒失程式碼任性地把所有它看不懂的編碼都改成問號;寫入資料時,這傢伙應該也會照樣殺出來攔路惡搞一通,才導致又是以問號收場。

上回讀出難字的訣竅在於將字串轉成16進位躲過盤查,寫入的問題我也打算如法炮製。讀取時多虧有RAWTOHEX把字串轉成16進位字串,這次則在UTL_RAW Package身上找到了救贖。UTL_RAW.CAST_TO_VARCHAR2可以將RAW(byte[])轉成VARCHAR2,真是佛心來著~~~

為了能忠實呈現BIG5罕字,我不貼程式碼,改以圖示說明:

sOMG中第1, 3, 5個字是集保罕用造字,而2, 4則是Unicode裡的通用字(可以看出二者字型不同)。原本要指定VARCHAR內容的地方要改成UTL_RAW.CAST_TO_VARCHAR2(:n1),且n1則傳入OracleType.Raw,資料來自sOMG轉型的byte[]。

cmd.Parameters.Add("n1", OracleType.Raw).Value = Encoding.GetEncoding("big5").GetBytes(sOMG);

結果如預期,第2, 4個Unicode難字在Encoding.GetEncoding("big5").GetBytes(sOMG)時陣亡化為問號,但VARCHAR2中忠實地保留了第1, 3, 5個罕用造字,挑戰成功!


Comments

# by NK

那是傳說中的Mini C# Lab 1.4嗎??

# by William Chen

hi~jeffrey大大, 我在您這個網站上有看到很多對於Oracle及MS SQL對於難字的解決方案,也對我很有幫助。也想請教是否能請你協助撰寫相關的程式??如果可以的話,能否回覆我,這是我的e-mail:williamchen@a****c.com.tw。 謝謝。 William Chen

# by Jeffrey

to William Chen, 如果在程式設計上有難字方面處理的問題,很歡迎你在這裡留言提問,大家互相切磋,我會盡力回覆,網站不時會有高手達人路過,說不定更能協助你解惑。

Post a comment