最近测试登录窗口的时候也遇到这个问题了,把我分析原因的过程和解决方法写下来供参考:
原因:"自定义用户管理之二"示例中,_UserTable临时表是没有加载数据的
新增用户:'张三',save后台数据已增加。注意此时_UserTable表中会增加一行 '张三'!
更改用户:张三改成李四,此时save后台只有李四,用户列表中也是李四
如果此时再增加张三就会报错"值"已存在!也许你会纳闷,明明后台和用户列表中都已经没有这个用户了啊,那是因为张三还在_UserTable中!
代码中dr = _UserTable.AddNew(),dr("Name") = UserName,主键列显然不会通过。
那换个新的用户"王五"行吗? 还是会报错,而且你再新增任何用户都会报错!
因为之前报错后的新增行,由于Name列是空值状态,之后所有AddNew时都会报错"空值"已存在!
问题的关键原因就在于对新增用户进行更改后,后台Name和_UserTable中Name是不同的!
解决方法:在更改用户时加个判断条件是不是新增的用户,即_UserTable中是否存在(注意用find,不是sqlfind),如果已经存在,在_UserTable中修改保存就行,不用再去后台找!
否则再去sqlfind。比如:
Dim dr2 As DataRow = _UserTable.Find("[Name]= '" & OldUserName & "'") '注意这里是find
If dr2 IsNot Nothing Then
dr2("Name") = UserName
dr2("Group") = UserGroup
dr2("Password") = PassWord
dr2.Save()
If Forms("用户管理").Opened Then
With Forms("用户管理").Controls("ListBox1")
.Items(.SelectedIndex) = UserName
End With
End If
e.Form.Close
Return
Else
Dim dr As DataRow = _UserTable.SQLFind("[Name]= '" & OldUserName & "'")
......