【转】c#中Guid的作用
【http://www.cnblogs.com/zhangtao1212/archive/2011/12/29/2305648.html】
1. 一个GUID为一个128位的整数(16字节),在使用唯一标识符的情况下,你可以在所有计算机和网络之间使用这一整数。 2. GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。例如:337c7f2b-7a34-4f50-9141-bab9e6478cc8 即为有效的 GUID 值。 3. 世界上(Koffer注:应该是地球上)的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。 4. 在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。 以下的C#命令行程序说明这一使用过程: using System; namespace DisplayGUID { class GuidExample { static void Main(string[] args) { GenerateGUID(); } static void GenerateGUID() { Console.WriteLine("GUID: " + System.Guid.NewGuid().ToString()); } } } 下面为这一程序的输出:(虽然不同系统之间的GUID是变化的。) GUID: 9245fe4a-d402-451c-b9ed-9c1a04247482 一个GUID可以在后台数据库中操作一个主键。以下代码使用一个GUID在一个后台数据库中存储信息,这一数据库包含以下的列: pk_guid—uniqueidentifier数据类型 name—nvarchar数据类型 这样出现一个包含文本框的简单Windows窗体。当选择按钮时,文本框中的数据被插入到数据库中。通过程序代码可以生成一个GUID并存储在其它列中: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using Microsoft.ApplicationBlocks.Data; namespace GuidDBExampleCSharp { public class frmBuilderTest : Form { private Label lblName; private TextBox txtName; private Button btnInsert; private Container components = null; public frmBuilderTest() { InitializeComponent(); } static void Main() { Application.Run(new frmBuilderTest()); } private string GenerateGUID() { return System.Guid.NewGuid().ToString(); } private void btnInsert_Click(object sender, System.EventArgs e) { string cs = "server=(local);Initial Catalog=Northwind;Integrated Security=SSPI"; using ( SqlConnection conn = new SqlConnection(cs) ) { try { string sqlInsert = "INSERT INTO dbo.tblBuilderTest (pk_guid, [name]) VALUES ('" + System.Guid.NewGuid().ToString() + "', '" + txtName.Text + "')"; conn.Open(); SqlHelper.ExecuteNonQuery(conn, CommandType.Text, sqlInsert); } catch(Exception ex) { System.Console.Write("Error: " + ex.Message); } } } } } 另一个GUID程序将一个唯一的标识符分配给一个.NET类或者接口,也就是说,GUID作为一个属性被分配给类或者接口。可以使用标准属性语法来实现这一过程: 我们可以扩展第一个范例来分配一个GUID。System.Runtime.InteropServices空间名称必须被引用来使用GUID属性。以下C#代码实现了这一过程: using System; using System.Runtime.InteropServices; namespace DisplayGUID { [Guid("9245fe4a-d402-451c-b9ed-9c1a04247482")] class GuidExample { static void Main(string[] args) { GenerateGUID(); } static void GenerateGUID() { Console.WriteLine("GUID: " + System.Guid.NewGuid().ToString()); } } }
数据表主健通常采用以下 3种方式:
1. 自动递增值
2. 唯名称这个是使用自己定义算法来生成个唯序列号
3. GUID(全局唯标识符)
GUID和自动递增值及唯名称比较GUID在客户端生成由GUID特性决定通过GUID生成值可能出现重复机会几乎
等于零因此保证在插入表时候主键值唯
可以方便处理分布式数据提交比如:分店数据向总店提交――直接将该部分数据插入即可
支持离线数据处理对本地数据包进行新增记录时即可将该数据表关键字段值赋值其处理思路方法是和在线新增
时是致
自动递增值 在数据库服务器端生成由于该值是由数据库系统内部处理亦保证其唯性但由于其是在数据库服务器
端生成因此必须将该值返回客户端客户端通过该值过行其它操作比如张单据(主从表)是使用自动递增值当插入单
据抬头后必须将单据抬头关键字段值返回再插入单据明细(单据明细是通过单据抬头关键字段进行关联)
不能很好处理分布式数据提交比如:分店数据向总店提交――提交数据时必须重新生成该数据表关键字段值以保证
该字段值唯
要支持离线数据处理需要进行额外处理对本地数据包进行保存记录(保存到本地)时需要插入个假设唯值在提交
离线数据回数据服务器时再重新生成真正唯值并重新进行相关处理
唯名称 在客户端生成或在服务端生成相对于自动递增值区别地方就是自己维护生成唯值算法及所保存临时值容
易造成出错或其它问题如果是在客户端生成唯值话还必须保证所生成值是唯
不能很好处理分布式数据提交比如:分店数据向总店提交――提交数据时必须重新生成(或预先处理)该数据表关键
字段值以保证该字段值唯
要支持离线数据处理需要进行额外处理对本地数据包进行保存记录(保存到本地)时需要插入个假设唯值在提交离
线数据回数据服务器时再重新生成真正唯值并重新进行相关处理
例子介绍说明下面以个新增单据保存比较GUID和自动递增值/唯名称差别
动作
GUID
自动递增值/唯名称
单据抬头
新增
单据抬头关键字段值:获取并填写
单据抬头关键字段值:无
保存
直接保存
首先获取并填写关键字段值然后再进行保存
返回
直接返回
返回时必须将关键字段值返回
单据明细
新增
关联单据抬头字段值:直接填写
单据明细关键字段值:获取并填写
关联单据抬头字段值:无
单据明细关键字段值:无
保存
直接保存
获取单据抬头关键字段值并填写到单据明细关联单据抬头字段中;
然后获取并填写单据明细关键字段值;
再进行保存
综合以上所述用GUID作为数据表关键字段值是可以减轻关键字段相关操作并且是最直接实用思路方法