Foxtable(狐表)用户栏目专家坐堂 → 请问我这里有代码会导致行重复新建吗?


  共有2649人关注过本帖平板打印复制链接

主题:请问我这里有代码会导致行重复新建吗?

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


加好友 发短信
等级:六尾狐 帖子:1266 积分:7849 威望:0 精华:4 注册:2017/12/31 14:53:00
请问我这里有代码会导致行重复新建吗?  发帖心情 Post By:2018/10/5 10:40:00 [只看该作者]

系统使用了大半年,新建了5000多条数据,偶尔一两次发现,新建行的时候会重复新建2条一模一样的行,不过_identify 是不一样的。非常罕见,大概1000行里会出现1次。客户的网络环境也不太好,是个垃圾的移动。服务器是深圳的阿里云

 

 错误效果:

 
此主题相关图片如下:1.png
按此在新窗口浏览图片 

重复错误的主要体现:CarFixID和CarFixTime完全一样。因为这2个都是通过HttpClient从服务器获取的网络环境下的自动编号与时间

 

请问下面代码,是否有会导致重复新建的可能性?

 

①窗口的新建行按钮:先判断能否成功获取自动编号,成功后再显示编辑窗口

If Functions.Execute("GetNewRow","CarFixID","CarFixInfo") Then
    Forms("CarFixEdit").show 
    Tables("CarFixInfo").AutoSizeCols

End If

 

②内部函数GetNewRow:给5秒的时候系统去获取最新编号,如果获取成功就继续,不成功,就RejectChanges

Dim NewID As String = args(0)'传递id的名字CarID
Dim TableName As String = args(1)'传递要新增行的Table的名字


Dim t As Table = Tables(TableName)
Dim r As Row = t.AddNew
Dim dn As Date = Date.Now
Do While Date.Now < dn.AddSeconds(5)
    If r.IsNull(NewID) = False Then
        Exit Do
    End If
    Application.DoEvents
Loop
If r.IsNull(NewID)=False Then
    Return True
Else
    t.DataTable.RejectChanges
    MessageBox.show("1连接服务器失败,网络不稳定,请重试!")
    Return False
End If

 

③DataRowAdding事件:调用GetNewID的内部函数去获取新ID,时间是通过内部函数,获取服务器上的时间,防止作弊

Dim NewID As Integer =  Functions.Execute("GetNewID","CarFixID")
If NewID > -1 Then
    e.DataRow("CompanyID") = PublicCompanyID
    e.DataRow("CarFixID") = NewID
    e.DataRow("CarFixUser") = PublicMHUserID
    e.DataRow("CarFixTime") = Functions.Execute("SqlDate")
    e.DataRow("CarFixStatus") = 1
End If

 

 

④内部函数GetNewID:使用HttpClient的方法,去获取最新编号,限制5秒超时

Dim s As String = args(0)'传递要获取的ID名,例如CarID

'HttpClient网络自动编号-----
Dim sWeb As String = DecryptText(SSL_ServerWeb,"cjj","xt")
Dim hc As New HttpClient(sWeb & "GetNewID.htm")
hc.Timeout = 5 '设置超时为5秒
hc.C & s & "f:"
Dim rt As String = hc.GetData()
Dim id As Integer
If rt > "" Then
    If  Integer.TryParse(rt,id)  Then
        Return id
    Else
        messagebox.show("服务器返回错误信息:" & rt)
        Return -1
    End If
Else
    messagebox.show("3连接服务器失败,网络不稳定,请重试!")
    Return -1
End If

 

④内部函数SqlDate(它在刚才的错误截图里,我们看到2个重复行的时间是完全一样的,说明这并不是系统重复新建了2次,如果是重复新建,那时间肯定不一样

'防止时间作弊,直接获取服务器时间-----
'无需传递参数
Dim cmd As New SQLCommand
Dim dt As Date
cmd.C
cmd.CommandText = "Select GetDate()"
dt = cmd.ExecuteScalar()
Return dt


[此贴子已经被作者于2018/10/5 10:41:54编辑过]

 回到顶部
总数 14 1 2 下一页