共有C#原生ID(流水番号)生成機能実現

5883 ワード

一、非貯蔵プロセスによって生成された流水番号
   /// <summary>

    /// 

    /// </summary>

    public static class DataBaseGenerator

    {

        /// <summary>

        /// 

        /// </summary>

        private static Int64 seed = Int64.Parse(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds.ToString("0"));



        /// <summary>

        /// 

        /// </summary>

        /// <returns></returns>

        public static Int64 GetPrimaryKey()

        {

            return Interlocked.Increment(ref seed);

        }

    }

二、ストレージプロセスはフロー番号1を生成し、まずデータベースにフロー番号を格納するテーブルを作成する
CREATE TABLE [dbo].[NumSeq] (

    [Cate] [varchar] (2)  NOT NULL ,

    [DateNo] [varchar] (4)  NOT NULL ,

    [Seq] [int] NULL ,

    [CrTime] [datetime] NOT NULL 

)

上のコードの中でCateフィールドは流水番号の頭で、下の記憶の過程の中でパラメータの方式で入ることができて、私の定義は2文字で、これは具体的な必要によってDateNoフィールドを変更して日付情報Seqフィールドを取得するために流水番号で、しかし最終的に生成した流水番号はこの3つのフィールドの加算です
2、ストレージ・プロシージャの作成
CREATE  PROC dpPMT_SGetMaintainSeq

@MaintainCate VARCHAR(2)



AS

--*********************** *************************************************

DECLARE @MaintainNo VARCHAR(12) 

IF NOT EXISTS(SELECT 

            *

        FROM

            NumSeq

        WHERE

            Cate=@MaintainCate AND DATEDIFF(DAY,CrTime,GETDATE())=0)

    BEGIN

        INSERT INTO 

            NumSeq(Cate,DateNo,Seq)

        values(@MaintainCate,RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+

                REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())),0)



    END

ELSE

    BEGIN

        UPDATE

            NumSeq

        SET 

            Seq=Seq+1

        WHERE

            Cate=@MaintainCate AND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+

                       REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE()))

    END



--************************ ***************************************************************

SELECT 

    @MaintainNo=Cate+DateNo+REPLICATE('0',6-LEN(Seq))+CONVERT(VARCHAR(6),Seq)

FROM

    NumSeq

WHERE

    Cate=@MaintainCate AND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+

                      REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE()))



SELECT @MaintainNo

このストレージ・プロシージャの最終出力の結果は、AA 0710310000001の前の2つが入力パラメータであり、中間の4つが年の後の2つと月であり、最後の6つが6桁の数字の流水番号である.また、上記のストレージ・プロシージャを変更して、必要に応じたストリーム番号を生成することもできます.