关于多用户下取最大数的锁定类型

likesome 2005-03-26 10:34:41
下面是是一个程序样例,在多用户访问的情况下,我要求能正确的执行下面的程序

原来在MaxBm的函数用,我用的是myRs.Open Sql, Conn, 1, 3,这样产生一个问题,如果有多用户执行,这样在Test过程中执行插入时,可能产生iCode重复

我现在打开方式改为了myRs.Open Sql, Conn, 2, 3,是不是能解决问题


解决得到直接解答,而不要给出什么一大堆的链接


Sub Test
iCode = MaxBm()
Sql = "INSERT INTO tablename(Code,Name) Values('" & iCode & "','" & iName & ")"
Conn.Execute(Sql)
End Sub

Public Function MaxBm() As String
Dim myRs As New ADODB.Recordset
Dim Sbm as String
Sql = "SELECT Top 1 Code FROM TabName ORDER BY Code DESC"
myRs.Open Sql, Conn, 2, 3
If myRs.EOF And myRs.BOF Then
Sbm = Cstr(Val(myRs("Code")) + 1)
End IF
myRs.Close
Set myRs = Nothing
MaxBm = Sbm
End Function


...全文
112 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
likesome 2005-04-05
  • 打赏
  • 举报
回复
谢谢大家,楼上的例子其实与我的MaxID一个功能,同样不适用于多用户情况下
其实我认为这个的解决办法应是新建一个表,放入最大ID,这样每增加一个这个表的ID加1,而这个表的打开方式为独占,这样就可以解决多用户访问的问题。

我的原意希望知道除了这个办法有没有更好的办法,看来是不可能了
xiaoxiaoP 2005-03-29
  • 打赏
  • 举报
回复

为什么不把该字段设为主键呢?有重复的话会提示出错了,关于数据库引擎底层操作的问题我们是不可知的,不从结构上严谨起来会出现许多莫名其妙的问题。
likesome 2005-03-29
  • 打赏
  • 举报
回复
MaxBm函数我不是在上面写出来了吗 ,就是取最大数呀

真要只能新建一个表来解决吗,我认为这应是一个较普遍的问题
ZMFKPLJ 2005-03-29
  • 打赏
  • 举报
回复
这是一个例子
'自动编号
Private Function AutoID() As String
Dim rs As New ADODB.Recordset
Dim strQuery As String
Dim intRowMax As Integer
Dim strBookingCode As String '预订单号

Dim strYMD As String '当前年月日
Dim strYear As String '当前年
Dim strMonth As String '当前月
Dim strDay As String '当前日

strYear = Right(Year(Date), 2)

If Month(Date) > 9 Then
strMonth = Month(Date)
Else
strMonth = "0" & Month(Date)
End If
If Day(Date) > 9 Then
strDay = Day(Date)
Else
strDay = "0" & Day(Date)
End If

strYMD = Trim(strYear & strMonth & strDay) '系统当前年月日
Set rs = Nothing
Set rs = New ADODB.Recordset
strQuery = "select bookingcode from bookingbaseinfo where bookingcode like '" & strYMD & "%'"
rs.Open strQuery, con, adOpenDynamic, adLockOptimistic, -1
If Not rs.BOF And Not rs.EOF Then
While Not rs.EOF
If intRowMax < Right(rs.Fields("bookingcode"), 4) Then
intRowMax = Right(rs.Fields("bookingcode"), 4)
End If
rs.MoveNext
Wend
Else
intRowMax = "0000"
End If
intRowMax = intRowMax + 1
strBookingCode = String(4, "0") & intRowMax
strBookingCode = Right(strBookingCode, 4)
strBookingCode = strYMD & strBookingCode
AutoID = strBookingCode
End Function
likesome 2005-03-29
  • 打赏
  • 举报
回复
为什么不把该字段设为主键呢?有重复的话会提示出错了,关于数据库引擎底层操作的问题我们是不可知的,不从结构上严谨起来会出现许多莫名其妙的问题。
____________________________________________________
当然,这个字段是主键,现在的问题就是多用户出现重复,现在CSDN的高手都很少了呀,是不是VB没人气呀
lfshf 2005-03-28
  • 打赏
  • 举报
回复
说说MaxBm是干什么用滴


看你的MaxBm是否需要严格连续,如不需要,用我的方法简单快捷
likesome 2005-03-28
  • 打赏
  • 举报
回复
请问这个问题正确的解答方法是什么
lfshf 2005-03-28
  • 打赏
  • 举报
回复
设一个自动增加的字段,AddNew后立即用作你的MaxBm,也不需要+1了
DreamManor 2005-03-27
  • 打赏
  • 举报
回复
up
cuilonggang 2005-03-27
  • 打赏
  • 举报
回复
不能,仍然有可能重复。
Mars.CN 2005-03-26
  • 打赏
  • 举报
回复
讲清楚一点好不好!

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧