1. 程式人生 > >Oracle中自動生成的guid與.Net中的guid的互動

Oracle中自動生成的guid與.Net中的guid的互動

最近在做一個T1的.NET專案,資料庫oracle的時候,遇到一個問題。.NET裡面的某個資料庫表類的某個欄位是guid型別。但是用oracle生成的guid。跟.NET的guid

無法識別。導致報錯。資料顯示不了。經過查資料,網上好像很少是專門去說明這個問題的部落格,後來經過多次檢視資料。故總結如下經驗。

在Oracle SQL 提供了一個生成guid的函式sys_guid:
SQL> select sys_guid() from dual ;
SYS_GUID()
--------------------------------
A8F662B86E7413FEE040970A437C6BD7

但是oracle生成的guid跟.NET的guid看起來不一樣。.net的guid是36字元(中間有4個-),oracle的只有32個數字。再將oracle的guid製造成跟.net的一樣。

CREATE OR REPLACE
FUNCTION get_uuid
RETURN VARCHAR
IS
guid VARCHAR (50);
BEGIN
guid :=sys_guid();
RETURN
substr(guid,1,8)||'-'||substr(guid,9,4)||'-'||substr(guid,13,4)||'-'||substr(guid,17,4)||'-'||substr(guid,21,12);
END get_uuid;

CREATE OR REPLACE
FUNCTION get_uuid
RETURN VARCHAR
IS
guid VARCHAR
(50); BEGIN guid :=sys_guid(); RETURN substr(guid,1,8)||'-'||substr(guid,9,4)||'-'||substr(guid,13,4)||'-'||substr(guid,17,4)||'-'||substr(guid,21,12); END get_uuid;
View Code

     但是通過.NET程式判斷,結果還是不一樣,這個時候,通過肉眼是看不到區別(因為我看了1個多小時都沒看出端倪。哈哈)。後來去檢視資料,就明白了原來是oracle生成的那個guid儲存方式跟.NET的儲存方式不一樣。分別是hextoraw與rawtohex。關於hextoraw與rawtohex請看下一篇文章。

後來修改成相同的儲存方式,就ok

CREATE OR REPLACE
FUNCTION get_uuid
RETURN VARCHAR
IS
guid VARCHAR (50);
BEGIN
guid := lower(RAWTOHEX(sys_guid()));
RETURN
substr(guid,1,8)||'-'||substr(guid,9,4)||'-'||substr(guid,13,4)||'-'||substr(guid,17,4)||'-'||substr(guid,21,12);
END get_uuid;