TIPS-用ADO.NET寫入BIG5罕用字到ORACLE VARCHAR

上回我們破解過"用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個罕用造字,挑戰成功!

歡迎推文分享:
Published 04 December 2008 03:40 PM 由 Jeffrey
Filed under: , , ,
Views: 79,896



意見

# NK said on 04 December, 2008 11:25 PM

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

# William Chen said on 12 September, 2012 02:56 AM

hi~jeffrey大大,

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

謝謝。

William Chen

# Jeffrey said on 12 September, 2012 05:29 PM

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

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<December 2008>
SunMonTueWedThuFriSat
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication