1. 程式人生 > >訂單流水號(唯一編號)的生成

訂單流水號(唯一編號)的生成

cast 編碼規則 就是 管理 private 靜態 substring substr 簡單

最近在做項目過程中,經常會遇到生成訂單流水號唯一性的應用,也有不少同事也請教我對唯一性的 "流水號"的問題,根據個人所見,一般生成的規則都是根據日期來進行操作,我目前在做的一個項目:”報告卡“上的編碼就是根據 ”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!

訂單流水號(唯一編號)的生成