我們先瞭解一下基本知識:
我們知道Oracle中有函數RAWTOHEX(rawvalue),將RAW類數值轉換成一個相應的16進位表示的字串,rawvalue中的每個位元組都被轉換成為一個雙位元組的字串。當我們給資料表中的ID定義成RAW(16)類型時,用RAWTOHEX(ID)得到的將是一個用16進位表示的字串,該字串的長度是32。同理RAW(8)得到的應該是一個長度為16的字串。
ORACLE中有一個SYS_GUID()函數,返回的是唯一的16進位表示的字串,長度也是32.因此我們可以給RAW(16)類型的ID設定預設值為:SYS_GUID(),但不能給位元組數小於16的RAW類型設定SYS_GUID(),會提示長度超出範圍。
接下來就是我遇到的問題了,通常我們在PL/SQL中寫查詢語句時都這麼寫:select ID from test,看到的ID顯示為已經被RAWTOHEX過的資料,比如:A03BDB52E4800D74E044001321BD1C8B,但我們在C#中查詢ORACLE資料庫時,會將RAW(16)類型的ID返回為一個 byte[]數組,長度為16.這和我們在PL/SQL中看到的ID是不一樣的。有時候在調試代碼時想看看這個ID是不是我們想要的ID時很不方便。因此我們有必要吧這個數群組轉換成和PL/SQL中一樣的資料顯示。
我們上面已經瞭解到這個byte[]數組中的每一個byte都被轉換成了一個雙位元組的字串,我們在C#中也定義一個RAWTOHEX函數,如下: static string RAWTOHEX(byte[] b)<br /> {<br /> StringBuilder sb = new StringBuilder();<br /> foreach (byte by in b)<br /> {<br /> string s = Convert.ToString(by, 16);//將位元組轉換成對應的字元<br /> if (s.Length==1)<br /> {<br /> s = "0" + s;//當字元不足兩位時,在前面補0,補足兩位字元,因為字串“01”轉換成的位元組為1,而將位元組再轉換成字串的時候就變成了“1”,因此要補0<br /> }<br /> sb.Append(s);<br /> }<br /> return sb.ToString().ToUpper();<br /> } ,同理,我們也可以定義一個HEXTORAW將16進位表示的字串轉換成byte[]數組方便插入資料庫。
static byte[] HEXTORAW(string str)<br /> {<br /> if (str.Length % 2 == 0)<br /> {<br /> byte[] b = new byte[str.Length / 2];<br /> int j = 0;<br /> for (int i = 0; i < str.Length; i += 2)<br /> {<br /> byte by = Convert.ToByte(str.Substring(i, 2), 16);//取兩個字元,轉換成對應的位元組<br /> b[j] = by;<br /> j++;<br /> }<br /> return b;<br /> }<br /> else<br /> {<br /> throw new Exception("不能將該字串轉換成RAW類型");<br /> }<br /> }