最近在做項目過程中,經常會遇到生成訂單流水號唯一性的應用,也有不少同事也請教我對唯一性的 "流水號"的問題,根據個人所見,一般生成的規則都是根據日期來進行操作,我目前在做的一個項目:”報告卡“上的編碼就是根據 ”yyyyMMdd+四位數字(累加)“的格式生成,一般對這一類的操作最好是在存儲過程中生成 ...
最近在做項目過程中,經常會遇到生成訂單流水號唯一性的應用,也有不少同事也請教我對唯一性的 "流水號"的問題,根據個人所見,一般生成的規則都是根據日期來進行操作,我目前在做的一個項目:”報告卡“上的編碼就是根據 ”yyyyMMdd+四位數字(累加)“的格式生成,一般對這一類的操作最好是在存儲過程中生成。
下麵,我們來簡單的舉兩種方法來生成訂單流水號的唯一性:
(1)通過存儲過程方式生成(以Oracle為例)
Create Or Replace Procedure MyProcedure
{
CV_1 OUT NVARCHAR2
}
AS
BEGIN
DECLARE
V_CURRENTCODE NVARCHAR2(100)
BEGIN
SELECT MAX([編碼欄位名]) INTO V_CURRENTCODE FROM [表名];
IF substr(V_CURRENTCODE,8) = to_char(sysdate,'yyyymmdd') THEN
SELECT
CAST(
CAST(nvl(Max(substr([編碼欄位名] , 0 ,8)),0) AS nvarchar2(30)) || CAST(nvl(Max(substr([編碼欄位名] , 9 ,4)),0) AS nvarchar2(30))
AS INT)+1
AS [編碼欄位名]
INTO CV_1
FROM [表名]
dbms_output.put_line(CV_1);
ELSE
SELECT DISTINCT(to_char(sysdate,'yyyymmdd')|| '0001') as [編碼欄位名] into CV_1 from dual ;
dbms_output.put_line(CV_1);
END IF;
END;
至於調用存儲過程我這裡就不舉例子了,微軟有專門提供訪問數據層中存在調用 ”存儲過程“的方法。
(2)通過程式代碼方式生成
/// <summary>
/// 生成流水號
/// </summary>
public class OrderHelper
{
/// <summary>
/// 幫助類
/// </summary>
private OrderHelper() { }
/// <summary>
/// 生成訂單編號
/// 生成規則yyyyMMdd+四位數字
/// </summary>
/// <returns></returns>
public static string GetOrderCode(string code)
{
if (string.IsNullOrWhiteSpace(code)) return string.Format("{0}{1}", DateTime.Now.ToString("yyyyMMdd"), "0001");
if (code.TrimEnd().Length <= 11 || code.TrimEnd().Length >= 13) return "當前編碼規則不正確!";
if (code.Substring(0, 8) == DateTime.Now.ToString("yyyyMMdd").TrimEnd())
{
if (Convert.ToInt32(code.Substring(9, 4)) >= 9999) return "當前編碼規則已最大值,聯繫管理員擴大存儲容量!";
return string.Format("{0}{1}", code.Substring(0, 8), (Convert.ToInt32(code.Substring(9, 4)) + 1).ToString());
}
else
return string.Format("{0}{1}", DateTime.Now.ToString("yyyyMMdd"), "0001");
}
}
只需調用靜態方法即可返回編碼。
本文章是新註冊用戶的第一篇文章,有不足之處,請留言賜教。。。
A Young idler ~ an old beggar!