Foxtable(狐表)用户栏目专家坐堂 → [求助] 如何在远程数据库上直接递增一个整数的值


  共有2125人关注过本帖树形打印复制链接

主题:[求助] 如何在远程数据库上直接递增一个整数的值

帅哥哟,离线,有人找我吗?
hgzvip
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:77 积分:826 威望:0 精华:0 注册:2015/9/5 18:02:00
[求助] 如何在远程数据库上直接递增一个整数的值  发帖心情 Post By:2017/11/18 19:42:00 [只看该作者]

如何在远程数据库上直接递增一个整数的值。
代码如下:
        Dim pcid As Integer '定义一个整数型变量:批次号
            Dim c md As New SQLCommand
            cmd.C '设置数据源名称
            cmd.C ommandText = "Select 最大号 f rom {排号表} where 类型 = '批次' "
            pcid  = cmd.E xecuteScalar() '返回当前批次的值
            pcid = pcid + 1 '把该值递增1
            cmd.C ommandText = "UP DATE {排号表} SET 最大号 = " & pcid & " WHERE 类型 = '批次'" '直接在后台更新递增后的批次号
            cmd.E xecuteNonQuery()

设计的意图如下:
为避免多用户同时进行相同操作导致批次号相同,保存时先在“排号表”中取一个号,再把这个号递增,然后就用递增的这个号,别的用户就不能再用这个号了。
但测试的时候,如果同时处理多行数据,以上代码是先取号回来,在用户电脑上递增后,再下一个修改远程数据表的命令,这里存在一个网络延时,实际测试时会出现大家用了相同的号。

请教老师,如何一步在后台递增这个值,然后返回这个值?

或者有没有什么变通的方法,让不同用户每次都领一个新的号?
[此贴子已经被作者于2017/11/18 20:01:21编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
hgzvip
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:77 积分:826 威望:0 精华:0 注册:2015/9/5 18:02:00
  发帖心情 Post By:2017/11/18 20:59:00 [只看该作者]

刚才参考了“网络环境下的复杂编号” http://www.foxtable.com/help/index.htm?page=1994.htm

是不是我这种要求只能通过OpenQQ的方式来实现了

 回到顶部
帅哥哟,离线,有人找我吗?
hgzvip
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:77 积分:826 威望:0 精华:0 注册:2015/9/5 18:02:00
  发帖心情 Post By:2017/11/19 1:09:00 [只看该作者]

经过几小时的学习、测试,成功修改。
过程大致如下:
1)新建一个服务器端项目,设置数据源和原项目数据源相同。
2)依据帮助文件,在全局代码中定义一个字典。
3)在服务器端项目属性中设置,启动读取【单据类型】表,把单据类型和已使用的最大号读入字典中。
4)依据帮助文件,在服务器端项目建立【用户】表(表是外部数据,以便在客户端中维护用户数据)。
5)依据帮助文件,定义代码并启动服务器端的OpenQQ。
6)定义代码,在客户端启动QQClient
7)在服务器端的“网络监视器”中,设置“ReceivedMessage”事件的代码:如果收到客户端传过来的具有特定格式的字符串,拆解提取这个字符串(单据类型),并在字典中查找相应的单据类型,把当前最大号加一,并更新数据库中的值,同时反馈给客户端。
这样修改后,每次需要写入单据编码的时候,就先向OpenQQ服务器发送一个取号请求,类似到银行排队取号一样,完美解决编号问题。

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/11/19 16:09:00 [只看该作者]

嗯嗯。sqlserver并发你无法控制,当然你可以编写【存储过程】,这样就能锁表,查询到唯一编号;

 

你也可以做一个服务器端如openqq,排队取号。

 

当然,你搭建一个http也可以。


 回到顶部