系统使用了大半年,新建了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编辑过]