请教一个关于多客户端软件在自动增加编号的问题!谢谢
如何在多客户端软件下实现编号自动增加得问题?如,产品编号;病人就诊号;发票号等等,要是在单机使用的软件上,可以直接在数据库中读取最大编号,然后加1就可以了,在要是在多客户时,就不行了,因为要是2个以上的人同时读取数据时,就不正确了~有什么方法可以解决这样的问题呢?想了很久,一直没什么头绪,请大家指教,谢谢 问题点数:20、回复次数:12Top
1 楼LHA(心动)回复于 2006-03-04 21:56:27 得分 0
存储过程呀!
假设你使用表IDTable来存这个序号
存储过程里面 :
开始事务
读取ID号
ID号+1 存入数据库
提交事务
Top
2 楼feiyun0112(http://feiyun0112.cnblogs.com/)回复于 2006-03-04 22:24:42 得分 0
一样的用,只需要把编号字段设为关键字
**********************************
*本人主要使用VB+MS SQL,C#略知一二
*
*如有相关问题需要帮助
*
*可发短消息告知链接
*
*助人为快乐之本!
**********************************
Top
3 楼xinyangt(信仰t)回复于 2006-03-04 22:54:33 得分 0
直接用你使用的数据库中自身提供的 标识自动增加列来放id 如果还有担心的话 再写个 触发器 来保证就可以了Top
4 楼talentmykaka(小林)回复于 2006-03-05 02:42:36 得分 0
可能大家理解错我意思了~上面的方法只能保证数据库中数据的唯一性,我是想在读取数据时就做到唯一性,比如从数据库中读取最大编号后,加1并赋值给TextBox1.Text,这是要是有2+客户端同时读取的话,因该这些客户端的TextBox1.Text值是一样的,怎么能做到不一样?按先后读取的顺序做个类似缓冲池一样的处理?Top
5 楼talentmykaka(小林)回复于 2006-03-05 13:22:40 得分 0
自己顶Top
6 楼dxef(丁学)回复于 2006-03-05 13:31:42 得分 0
我是做医院信息管理系统的,这种情况我们通过加操作员区分,每个操作员有自己的流水号
比如101用户产生的是:200603071010001 200603071010002 20603071010003
而另一个用户102则是:200603071020001 200603071020002 20603071020003
这个流水号最好用一个单独的表存放,只需要每个操作员一条记录就OK了
比如:
101 0001
102 0005
每天第一次生成时都重置一下,所有编号都可以采取这种方式,对以后的统计查询也有一定好处,可以通过拆分字符串获取到这一流水的时间和操作员Top
7 楼sarcophile(食肉动物)回复于 2006-03-05 13:58:06 得分 0
我明白你的意思,我的做法是保存之后才有编号,如果不保存就使用(比如打印)的话,就提示:没有有效的(订单)编号,设为000000。保存之后再读出来,就可以有正确的编号了
不知道有没有更好的方法,反正我是没想出来,gzTop
8 楼xinggg(风之渡)回复于 2006-03-05 14:19:44 得分 0
保存之前就取编号当然也可以了,只要用一个专门放编号的表,再加锁(不过会比较耗费资源),不过问题是你同时两个人取,然后先取的那个,他的编号并没有使用,那这时就会出现跳号了Top
9 楼talentmykaka(小林)回复于 2006-03-05 23:59:44 得分 0
xinggg(风之渡)
我以前就用过你的方法,就是因为无法处理跳号的问题,所以才不用了。
dxef(丁丁)
我也作过医院的HIS系统,使用分配给每个操作员一段编号的方式,但这种方法有时在组长查询的时候不太方便,缺少一些连续性。
我一直向寻找到一种能在多客户端软件下能连续编号的好方法,希望大家能讨论讨论。Top
10 楼yuanarea(Sail before)回复于 2006-03-06 09:28:00 得分 0
我没做过医院业务流系统,不过听大家的叙述可以认为是
sarcophile(食肉动物) 的方法,可以存在废弃的编号 - 跳号出现
解决可以通过第一次查询时(或固定时间)重新排号
(问一下,如果废弃的编号记录是否需要保存在数据库)
dxef(丁丁)的方法,对应编号到ID,我开始也是这么想的,看来是理解错了,编号是序列的.
既然有废弃的号存在,你这种想法更本不可能一步实现~,
不过考虑先化出1定区段的号(50个),废弃的编号等待优先重新利用,一个区段用完后在申请另一个区段,随后可根据时间先后排序,也可根据编号顺序显示,有需要可以重新编号Top
11 楼aa790312(air)回复于 2006-03-06 09:34:01 得分 0
Application.LOCK
Application.UnLOCK
这样的控制就可以了
Top
12 楼xinggg(风之渡)回复于 2006-03-06 22:19:57 得分 0
要么这样,实现未用号回收,回收到一张表里,每次申请,可以根据要求取回收号或是新号Top




