[.NET] 取得不重覆流水號的方式

[.NET] 取得不重覆流水號的方式

在很多系統的開發上,會有需要取得流水號作為每一筆資料了序號,並當作主鍵值

之前作過的經驗,將流水號的設定放至於資料庫中,透過預存程序本身Transition的處理,就可以達到取得不重覆流水號的功能

作法如下


1. 於資料庫中建立一資料表Config


CREATE TABLE [dbo].[Config](
[ConfigName] [varchar](50) NOT NULL,
[ConfigValue] [varchar](255) NOT NULL,
CONSTRAINT [PK_Config] PRIMARY KEY CLUSTERED
(
[ConfigName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

其中ConfigName是流水號的名稱,如”JoinNo”, ConfigValue是流水號的值,一開始可以給0

下圖為系統中的應用內容,可以看到目前已經有四種不同的流水號正在使用中

clip_image001


2.建立一個預存程序GetSequence,內容如下


Create PROCEDURE [dbo].[GetSequence]
@SeqName varchar(50)
AS
BEGIN
declare @strNewSeqVal varchar(255)
declare @intNewSeqVal int
set NOCOUNT ON
update Config set @strNewSeqVal = ConfigValue = convert(int, ConfigValue) + 1 where ConfigName = @SeqName
set @intNewSeqVal = convert(int, @strNewSeqVal)
return @intNewSeqVal
END

3.在程式中建立如下的類別


/// <summary>
/// 取得共用的編號
/// </summary>
/// <returns></returns>
public int GetSeqSN(string strConfigName
{
SqlCommand SqlCmd = new SqlCommand();
string strSql = "GetSequence";
SqlCmd = new SqlCommand(strSql, SqlConn);
SqlCmd.CommandType = CommandType.StoredProcedure;
SqlCmd.Parameters.AddWithValue("@SeqName", strConfigName);

SqlParameter SqlRtnParam = new SqlParameter();
SqlRtnParam.Direction = ParameterDirection.ReturnValue;
SqlCmd.Parameters.Add(SqlRtnParam);

SqlCmd.Connection.Open();
SqlCmd.ExecuteNonQuery();
SqlCmd.Connection.Close();

int intSeqSN = int.Parse(SqlRtnParam.Value.ToString());
return intSeqSN;
}

往後,只要有需要取得在Config中所設定的流水號,就呼叫

int intJoinNo = new Class.GetSeqSN(“JoinNo”);

就可以得到不重覆的流水號了

當然,strConfigName的參數可以自行更改,若是有需要多個不同的流水號,只要在Config資料表中增加即可