首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

销售单据号重复有关问题

2012-04-13 
销售单据号重复问题最近开发一套MIS,中间财务记录涉及到销售单据号的问题,因为页面试用了ViewState来存储

销售单据号重复问题
最近开发一套MIS,中间财务记录涉及到销售单据号的问题,因为页面试用了ViewState来存储临时表的方案,单据号我采用随机生成的数拼合而成,但依然在跨地区,多人同时操作时,偶尔产生单据号重复错误问题,我纳闷了很久,不知道是ViewState影响的?还是并发操作就算试用随机也会产生单据号重复?到此刻还未解决,寻求大家帮忙!

C# code
#region  重写加载视图状态方法        protected override void LoadViewState(object savedState)        {            base.LoadViewState(savedState);            //取得编辑前的datatable的视图状态               if (ViewState["TempClassList"] != null)            {                dt = (DataTable)ViewState["TempClassList"];            }        }        #endregion        #region  重写保存视图状态方法        protected override object SaveViewState()        {            ViewState["TempClassList"] = dt;            return base.SaveViewState();        }        #endregion单据号产生方案如下:/// <summary>        /// 产生财务缴费流水号        /// </summary>        public string InitBarCode()        {            string id = "XS";            Random r = new Random();            id += DateTime.Now.Second.ToString().Length == 1 ? "0" + DateTime.Now.Second.ToString() : DateTime.Now.Second.ToString() + r.Next(100000000).ToString();            return id;}


当然我其中需要先插入临时表中的数据,然后再插入财务销售收费记录,依然有发生单据号重复的几率,不知道什么原因?寻求高人指点。

[解决办法]
你使用秒+随机数做单据号我觉得并不是很合理,秒的时间间隔只有一分钟,下一分钟就会出现重复,随机数也存在重复出现的概率,所以你这个方法即使不并发也会出现重复,相反,并发的时候在同一秒取数的概率不高,反而不会重复。建议单据号加上年月日,当然彻底排除并发仅靠单据号是无法解决的。
[解决办法]
探讨
你使用秒+随机数做单据号我觉得并不是很合理,秒的时间间隔只有一分钟,下一分钟就会出现重复,随机数也存在重复出现的概率,所以你这个方法即使不并发也会出现重复,相反,并发的时候在同一秒取数的概率不高,反而不会重复。建议单据号加上年月日,当然彻底排除并发仅靠单据号是无法解决的。

[解决办法]
随机数都伪随机,不保证完全一致。

销售单编号不能是完全随机的,市面上通常是机构编码+日期+当天序号。

生成编码的时候,要用个lock 来保证同一时刻只执行一次。

销售单是有主表和子表的,程序添加完主表以后就可以解锁了。速度是非常非常快的。
[解决办法]
加年月日吧 光靠秒数太少了
[解决办法]
在数据库中把单号做成唯一的键,在程序里面再做判断。
[解决办法]
public string InitBarCode()
{
string id = "XS";
Random r = new Random();
id += DateTime.Now.Second.ToString().Length == 1 ? "0" + DateTime.Now.Second.ToString() : DateTime.Now.Second.ToString() + r.Next(100000000).ToString();
return id;
}
===============================
这个代码的可靠性巨差。
多次调用 DateTime.Now.Second.ToString() 很可能最终是不一样的。
对DateTime 自带的函数非常不了解。
直接来个 DateTime.Now.ToString("ss");就完了。

热点排行