当前位置:文档之家› GUID使用经验

GUID使用经验

?
1. C# 對Guid结构類型的處理:

聲明Guid變量,並設置初始值:
Guid varGuid = Guid.Empty; //各位都是0
Guid varGuid = Guid.NewGuid(); //具體的值

把字符串轉換成Guid:
Guid --> String: string guidStr = Guid.NewGuid().ToString();
String --> Guid : Guid varGuid = new Guid(guidStr);

2. GUID 在数据库中的两种存储方式 和 OpenFx對Guid類型的處理方式:

对于GUID类型数据(是一个很大的整数),在数据库中有两种存储方式,

MS SQL Server: 可以是uniqueidentifier,也可以是Varchar(36)。
所以对于不是GUID的varchar类型,长度不要设成36,可设成40等。
MS SQL Server可以用newid()系統函數給uniqueidentifier类型欄位設置默認值.

Oracle: 可以是RAW(16),也可以是Varchar2(36) 。
所以对于不是GUID的RAW类型,长度不要设成16,可设成20等; 对于不是GUID的varchar2类型,长度不要设成36,可设成40等。
ORACLE 可以用SYS_GUID()系統函數取得一個Guid, 但是字符順序跟windows系統不一樣.

Oracle中如果存为RAW(16)类型,里面没有”-“符号,数据不能直接转换成MS SQL的uniqueidentifier类型,
但是占用空间少(16bytes)。如果存为varchar2类型,则能直接转换成MS SQL的uniqueidentifier类型,但是占用空间稍多(36bytes)。

Oracle中如果存为RAW(16)类型,DataTable/DataReader中返回的是字节数组(byte[]),可以通过以下语法转换成Guid:
Guid rowGuid = new Guid((byte[])dataTable1.rows[0]["row_guid"]);
dataTable1.rows[0]["row_guid"] is byte[] 会返回true;

另外提醒一下:Oracle的GUID类型的字符串排列顺序 跟Windows系统的GUID不同,两者不能直接转换,于是在
https://www.doczj.com/doc/461240169.html,monUtil类中定义了一个方法来转换: ToWinGuidFromOracle(string oracleGuidString),从Oracle的GUID类型的字符串
返回Windows的Guid结构类型。


3. 同時提供兩個將Oracle GUID 轉換成Windows系統的Guid的自定義函數:
(注意:internet網上也可以搜到這樣的函數,但是是錯誤的,大家不要以訛傳訛,以我下面經過工程檢驗的為准)

CREATE OR REPLACE PACKAGE BODY pkg_common IS
/*===========================================================================
Author: LiuFuhuang
Create date: 2010-09-15
Description: 將Oracle的GUID格式 轉換成Windows格式的GUID字符串{8-4-4-4-12}
注意:Oracle的GUID类型的字符串排列顺序 跟Windows系统的GUID不同,两者不能直接转换.
Parameter:
To Call : select pkg_common.ToWinGuid(SYS_GUID()) from dual
===========================================================================*/
function ToWinGuid (p_oracleGuidStr VARCHAR2) return varchar2 is
v_guid varchar(32);
v_winGuidStr varchar(36);
begin
v_guid := p_oracleGuidStr;

--注意:Oracle的SUBSTR(startPosition,length),

startPosition是從1開始的,而C#是從0開始的
v_winGuidStr :=
substr(v_guid,7,2) ||
substr(v_guid,5,2) ||
substr(v_guid,3,2) ||
substr(v_guid,1,2) || '-' ||
substr(v_guid,11,2) ||
substr(v_guid,9,2) || '-' ||
substr(v_guid,15,2) ||
substr(v_guid,13,2) || '-' ||
substr(v_guid,17,4) || '-' ||
substr(v_guid,21,12);
return v_winGuidStr;
end ;

/*===========================================================================
Author: LiuFuhuang
Create date: 2010-09-15
Description: 將Oracle的SYS_GUID()返回的GUID 轉換成Windows格式的GUID字符串{8-4-4-4-12}并返回。
注意:Oracle的GUID类型的字符串排列顺序 跟Windows系统的GUID不同,两者不能直接转换.
Parameter:
To Call : select pkg_common.GetWinGuid() from dual
===========================================================================*/
function GetWinGuid return varchar2 is
v_guid varchar(32);
v_winGuidStr varchar(36);
begin
v_guid := SYS_GUID();

--注意:Oracle的SUBSTR(startPosition,length),startPosition是從1開始的,而C#是從0開始的
select pkg_common.ToWinGuid(SYS_GUID()) into v_winGuidStr from dual;
return v_winGuidStr;
end ;

end package;


4.因為GUID數據的無序性,大家對Guid類型的欄位設置索引的時候,設置成一般的唯一索引即可,不要設置成簇索引,
否則會引起數據庫性能的降低。

如果設置成Primary Key,要把Create As Clustered設置成No!


5.另外一點Oracle的使用經驗: Oracle中欄位的默認值 可以設置成系統函數,但是不能設置成用戶自定義函數();
所以不能把欄位的默認值設置成pkg_common.ToWinGuid(SYS_GUID()).
只能在前臺用C# 給Guid字段賦值,或者用上面的函數 在SQL語句中賦值。

另外,設置數據庫的默認值,必須同時設置欄位NOT NULL,默認值才起作用! 我發覺這個規則有些同仁不知道。


===============
ORACLE 没有select * into new_table from old_table语句,要达到这个目的,要这样做:

create table usy_FUNCTION1 as select * from usy_FUNCTION;

insert into usy_FUNCTION1 select * from usy_FUNCTION

相关主题
文本预览
相关文档 最新文档