我要生成一个单据号,例如200604161130580001,年月日时分秒+4位流水号
这个单据号在数据操作层中生成好,还是在数据库的存储过程(或触发器)中生成比较好?这个具体要怎么生成啊?
因为单据号不能重复,所以必须考虑到并发。我的基本思路时,前面的时间可以直接取服务器的系统时间,如果是在同一时刻插入的数据,单据号后面4位的依次+1,如果不是同一时刻,那么就重新从0001开始。
但是这个具体怎么做我还没去想,也不知道这个方法好不好?求教一下,其他人是怎么做的?有何更好的方法?

解决方案 »

  1.   

    补充说明,我用的是MS SQL Server 2000最好大家能贴一下源码
      

  2.   

    可以在代码中生成
    使用时先lock这个生成的方法
    用完再释放
      

  3.   

    to 这个单据号在数据操作层中生成好,还是在数据库的存储过程(或触发器)中生成比较好?如果你的数据操作端是汇聚到一点,例如三层中的db操作层的话,可以放到数据操作端,但是要用事务来生成,而且这段操作要进行互斥。否则,建议在数据库端进行处理,用存储过程来实现,即单据号在存储过程中生成。
      

  4.   

    to 数据库里面如何生成最后4位流水号?把后四位先截取,然后转换成int型,然后max加1即可。
      

  5.   

    如果要考虑并发可以这样
    另外搞个表用于记录所有表的当前最大值
    比如说,
    Kindname,maxvalue
    CG,100则你要生成下一个单的采购单号时,可以
    先把100+1后返回再加上时间处理为你要的单号--------------------------------
    当然,如果你在编辑数据时,不需要显示单号的话,那
    就可以直接用凼数+默认值就行--------------------------------
    要不然,锁定时间会过长,影响使用
      

  6.   

    我个人认为根据你的需求 用
    DateTime.Now.ToUniversalTime().ToString().Replace("-","").Replace(" ","").Replace(":","")
    这样生成本身就不会重复了~~~~
      

  7.   

    可以使用SQL语句里的COUNT(*)取到记录条数当然要加上WHERE条件,然后再填加前面的0,写入回去