技术开发 频道

简谈SQL Server主键和自动编号

  除了使用存储过程实现COMB数据外,我们也可以使用C#生成COMB数据,这样所有主键生成工作可以在客户端完成。C#代码如下:

//================================================================
/**////
/// 返回 GUID 用于数据库操作,特定的时间代码可以提高检索效率
///
/// COMB (GUID 与时间混合型) 类型 GUID 数据
public static Guid NewComb()
{
byte
[] guidArray = System.Guid.NewGuid().ToByteArray();
DateTime baseDate = new DateTime(1900,1,1);
DateTime now = DateTime.Now;
// Get the days and milliseconds which will be used to build the byte string TimeSpan days = new TimeSpan(now.Ticks - baseDate.Ticks);
TimeSpan msecs
= new TimeSpan(now.Ticks - (new DateTime(now.Year, now.Month, now.Day).Ticks));
// Convert to a byte array
// Note that SQL Server is accurate to 1/300th of a millisecond so we divide by 3.333333
byte
[] daysArray = BitConverter.GetBytes(days.Days);
byte
[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds/3.333333));
// Reverse the bytes to match SQL Servers ordering Array.Reverse(daysArray);
Array.
Reverse(msecsArray);
// Copy the bytes into the guid Array.Copy(daysArray, days
Array.Length
- 2, guidArray, guidArray.Length - 6, 2);
Array.Copy(msecsArray, msecsArray.Length
- 4, guidArray, guidArray.Length - 4, 4);
  
return new System.Guid(guidArray); }
  
//================================================================
/**////
/// 从 SQL SERVER 返回的 GUID 中生成时间信息
///
///
  包含时间信息的 COMB
/// 时间
public static DateTime GetDateFromComb
(System.Guid guid)
{
DateTime baseDate = new DateTime(1900,1,1);
byte
[] daysArray = new byte[4];
byte
[] msecsArray = new byte[4];
byte
[] guidArray = guid.ToByteArray();
  
// Copy the date parts of the guid to the respective byte arrays.
Array.Copy(guidArray, guidArray.Length
- 6, daysArray, 2, 2);
Array.Copy(guidArray, guidArray.Length
- 4, msecsArray, 0, 4);
  
// Reverse the arrays to put them into the appropriate order
Array.
Reverse(daysArray);
Array.
Reverse(msecsArray);
  
// Convert the bytes to ints int
days
= BitConverter.ToInt32(daysArray, 0);
int msecs = BitConverter.ToInt32(msecsArray, 0);
  
DateTime date = baseDate.AddDays(days);
date
= date.AddMilliseconds(msecs * 3.333333);
return date;
}

  结语

  数据库主键在数据库中占有重要地位。主键的选取策略决定了系统是否高效、易用。本文比较了四种主键选取策略的优缺点,并提供了相应的代码解决方案,希望对大家有所帮助。

0
相关文章