WinForm/C# UpdateCommand 并发性错误求助

wanghaiwen · 2019年02月03日 · 82 次阅读

新增一条数据后,保存,修改该条数据的任一字段,在保存,报错,但是修改其他行的数据没有这个错误,只有修改刚刚保存的这一行数据才会出现这种错误,当界面数据重新加载后,在修改该数据,保存成功,百思不得其解,求助!

原因找到了,是在保存的时候修改了主键字段,但是修改前后的值并未变化,至于为什么重新加载数据后再修改,保存时不会报错仍然无解

---收回前言,还是有这个报错...见鬼了

首先要搞明白报错背后的问题是什么。 当 update T set a='xxx' where ID=1 时,若数据库中表 T 没有 ID=1 的记录,会报这个错。

xinggang 回复

首先要搞明白报错背后的问题是什么。 当 update T set a='xxx' where ID=1 时,若数据库中表 T 没有 ID=1 的记录,会报这个错。

后来的测试还是有这个问题,这条数据是在数据库里的,没有修改任何主键,如果是修改主键的问题导致更新数据时找不到这条数据,那应该是不论什么时候修改后保存都会报这个错才对,但现在是重新加载数据后,再修改后保存是不报这个错的,很奇怪...

另外还有一点,我的代码里的行切换事件里,当主表当前行的状态是新增而子表有数据时,会清空下子表,防止界面上残留数据,子表就是我修改后保存报错的 Grid,当我主表新增一行后,此时子表数据被清空,在切回我要修改的那行主表数据,此时修改加载出来的子表数据在保存不报错,也就是说只要数据重新加载,再修改一点问题没有,是不是和这个数据源的状态有关?

wanghaiwen 回复

后来的测试还是有这个问题,这条数据是在数据库里的,没有修改任何主键,如果是修改主键的问题导致更新数据时找不到这条数据,那应该是不论什么时候修改后保存都会报这个错才对,但现在是重新加载数据后,再修改后保存是不报这个错的,很奇怪...

说了这么多你也没找到根本,执行的 sql 中 where 条件中主键的值是多少,你看了吗? 113 服务器是可以跟踪 sql 执行情况的,跟踪一下 1 钟就能让你找到答案。

补充一下,where 条件中的主键值是用列的原始值,不是当前值。

xinggang 回复

说了这么多你也没找到根本,执行的 sql 中 where 条件中主键的值是多少,你看了吗? 113 服务器是可以跟踪 sql 执行情况的,跟踪一下 1 钟就能让你找到答案。
补充一下,where 条件中的主键值是用列的原始值,不是当前值。

找到原因了,的确是主键问题,是因为 BillDate 这个字段的默认值直接使用了 currTime 这个对象赋值,没有转为 DateTime 后 ToString("yyyy/MM/dd"),本来想减少类型转换,但却出了错 [s:汗]

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册