Foxtable(狐表)用户栏目专家坐堂 → 【求助】自动编号


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

主题:【求助】自动编号

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


加好友 发短信
等级:幼狐 帖子:117 积分:973 威望:0 精华:0 注册:2016/11/1 8:13:00
【求助】自动编号  发帖心情 Post By:2016/12/21 22:52:00 [只看该作者]

老师,下面的这段代码中,cmd2.commandText = "Updat e [编号] Set [顺序号] = " & (Key + 1) & " Where [顺序号] = " & Key & " And [前缀] = '" & pf & "'"  这条语句肯定会执行成功的,也就是cmd2.ExecuteNonQuery() > 0 肯定会成立的,为什么还要用 DO......LOOP 循环呢?而且DO......LOOP又没有判断条件,如果cmd2.ExecuteNonQuery() > 0不成立的话,那程序不是死循环了??麻烦老师解释下,谢谢啦!!

Dim dr As DataRow = e.DataRow
Dim
pf As String
If
dr.RowState <> DataRowState.Added Then '如果不是新增行
Return '那么返回
ElseIf
dr.IsNull("日期") Then '如果没有输入日期
e.Cancel =
True '取消保存此行
MessageBox.Show(
"必须输入日期!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
Return
Else

pf = Format(dr(
"日期"),"yyMM") '否则获得编号的前缀,两位年,两位月
End
If
Dim
cmd1 As New SQLCommand
Dim
cmd2 As New SQLCommand
Dim
Key As Integer
cmd1.ConnectionName =
"编号" '设置数据源名称
cmd2.ConnectionName =
"编号"
cmd1.commandText =
"Select Count(*) Fro m [编号] Where [前缀] = '" & pf & "'"
If
cmd1.ExecuteScalar = 0 Then '如果编号表不存在前缀的行,那么增加一行
cmd1.commandtext = "Inser t Into 编号 (前缀, 顺序号) Values('" & pf & "',1)"
cmd1.ExecuteNonQuery
End If

cmd1
.commandText = "Selec t [顺序号] Fro m [编号] Where [前缀] = '" & pf & "'"
Do 
Key
= cmd1.ExecuteScalar() '从后台获得顺序号
cmd2
.commandText = "Updat e [编号] Set [顺序号] = " & (Key + 1) & " Where [顺序号] = " & Key & " And [前缀] = '" & pf & "'"
If
cmd2.ExecuteNonQuery() > 0 Then '更新顺序号
Exit Do
'更新成功则退出循环
End If
Loop

e.
DataRow("编号") = pf & "-" & Format(Key,"0000")

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2016/12/21 23:56:00 [只看该作者]

 有可能,网络断开或者执行不成功,导致编号出错。加上循环,是为了保险。

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


加好友 发短信
等级:幼狐 帖子:117 积分:973 威望:0 精华:0 注册:2016/11/1 8:13:00
  发帖心情 Post By:2016/12/22 8:09:00 [只看该作者]

老师,如果网络断开或者执行不成功,DO......LOOP又没有判断条件,是不是进入死循环了??

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


加好友 发短信
等级:超级版主 帖子:106242 积分:540333 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/12/22 8:36:00 [只看该作者]

ExecuteNonQuery如果执行不成功一般会抛出异常而中断整个事件。

不过这样的作法确实不够严谨,可以再加上一个计数,超过多少次执行不成功就提示错误然后退出循环。

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


加好友 发短信
等级:幼狐 帖子:117 积分:973 威望:0 精华:0 注册:2016/11/1 8:13:00
  发帖心情 Post By:2016/12/22 10:33:00 [只看该作者]

老师,这样可以??

Dim i As Integer = 1
Do While i <= 3
    Key
= cmd1.ExecuteScalar() '从后台获得顺序号
    cmd2
.commandText = "Updat e [编号] Set [顺序号] = " & (Key + 1) & " Where [顺序号] = " & Key & " And [前缀] = '" & pf & "'"
    If
cmd2.ExecuteNonQuery() > 0 Then '更新顺序号
        Exit Do
'更新成功则退出循环
    else
i = i + 1
End If
Loop

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2016/12/22 10:46:00 [只看该作者]

 回复5楼,可以的。

 回到顶部