Feedback

C# - Sequential GUID

Veröffentlicht von am 10/23/2008
(3 Bewertungen)
GUIDs werden in Datenbank oft als ID verwendet. Wird die ID-Spalte indiziert erfolgt beim Einfügen von neuen Werten eine Neustrukturierung der Daten.

Deshalb gibt es im SQL Server 2005 (und neuer) die Methode NEWSEQUENTIALID.

Wird zB LINQtoSQL verwendet und die IDs auf Clientseite generiert wäre es nützlich auch NEWSEQUENTIALIDs zu erzeugen.
Nachfolgend beschrieben Klasse erstellt eine GUID die größer ist als ein je auf dieser Maschine erstellte GUID.
using System;

namespace gfoidl.Tools
{
	public class Guid
	{
		#region API
		[System.Runtime.InteropServices.StructLayoutAttribute(
			System.Runtime.InteropServices.LayoutKind.Sequential)]
		private struct GUIDDATA
		{
			public int Data1;
			public short Data2;
			public short Data3;

			[System.Runtime.InteropServices.MarshalAsAttribute(
				System.Runtime.InteropServices.UnmanagedType.ByValArray,
				SizeConst = 8)]
			public byte[] Data4;
		}

		[System.Runtime.InteropServices.DllImportAttribute("rpcrt4.dll")]
		private static extern int UuidCreateSequential(out GUIDDATA Uuid);
		#endregion
		//---------------------------------------------------------------------
		/// <summary>
		/// Erstellt eine GUID
		/// </summary>
		/// <returns>
		/// GUID
		/// </returns>
		public static System.Guid NewID()
		{
			return System.Guid.NewGuid();
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Erstellt eine GUID die größer ist als ein je auf dieser
		/// Maschine erstellte GUID
		/// </summary>
		/// <returns>
		/// GUID
		/// </returns>
		public static System.Guid NewSequentialID()
		{
			GUIDDATA guiddata;

			if ((UuidCreateSequential(out guiddata) & 0x80000000) != 0) // FAILED(hr)  
				throw new InvalidOperationException();

			return new System.Guid(
				guiddata.Data1,
				guiddata.Data2,
				guiddata.Data3,
				guiddata.Data4);
		}
	}
}
Abgelegt unter GUID, LINQ, ID.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!