想做一个局域网多人用的系统,但是不想上OpenQQ这种“服务器+客户端”双程序维护的模式,想直接利用Access数据库+单客户端
其中会遇到一个问题:就是如何多人下并发新增时生成不重复编号?
这个字段在新增的时候不存在,保存后会发生变化,并不合适做自增字段,见下图
e.DataRow("编号")= e.DataRow("identify")

而且identify字段在表迁移的时候,还会自动重新计算,用它做自动编号,就是非常不靠谱的

e.DataRow("编号")= e.DataTable.SqlCompute("Max(编号)") +1并发下直接死掉,肯定重复的
参考狐表文档的《网络环境下的复杂编号》思路,我在基础上进一步精简代码,更加便捷易用

'通过Functions.Execute("获取自动编号","表名")使用
'传入表名,返回这个表当前可用的新自增编号
'思路参考狐表官方文档《网络环境下的复杂编号》,实测异步并发生成也不会有重复编号
Dim tableName As String = Args(0)
Dim cmd As New SQLCommand
cmd.ConnectionName = "DB" '数据库源名称
cmd.commandText = "Select Count(*) From 自动编号表 Where 表名 = '" & tableName & "'"
If cmd.ExecuteScalar = 0 Then '如果编号表不存在该表名的记录,那么增加一行
cmd.commandtext = "Insert Into 自动编号表 (表名, 当前编号) Values('" & tableName & "',1)"
cmd.ExecuteNonQuery
End If
Dim No As Integer
Do
'1从后台获取当前最新编号
cmd.commandText = "Select 当前编号 From 自动编号表 Where 表名 = '" & tableName & "'"
No = cmd.ExecuteScalar()
'2尝试更新编号,确保编号可用
cmd.commandText = "Update 自动编号表 Set 当前编号 = " & (No + 1) & " Where 当前编号 = " & No & " And 表名 = '" & tableName & "'"
Try '超过数据库并发承受力,会出现“行被锁定,无法更新”,要能捕获错误并跳过继续尝试
If cmd.ExecuteNonQuery() > 0 Then '更新编号
Exit Do '更新成功,说明编号可用,则退出循环
End If
Catch ex As Exception
End Try
Loop
Return Noe.DataRow("编号") = Functions.Execute("获取自动编号", e.DataTable.Name)

