[.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
下圖為系統中的應用內容,可以看到目前已經有四種不同的流水號正在使用中
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資料表中增加即可