可能是并发引起的错误 Row not found or changed,怎样处理

那小x的传说 2012-11-19 02:38:33
  public bool DelCategory(int id)
{
bool ret = false;
try
{
List<int> list = new List<int>();
if (!list.Contains(id))
{
list.Add(id);
}
list = GetKey(id, list);

var x = from s in dbLinq.MaterialAttributes where list.Contains(s.ID) select s ;
foreach (var n in x )
{
dbLinq.MaterialAttributes.DeleteOnSubmit(n);
try
{
dbLinq.SubmitChanges();
}
catch (System.Data.Linq.ChangeConflictException)
{
foreach (System.Data.Linq.ObjectChangeConflict occ in dbLinq.ChangeConflicts)
{

//以下是解决冲突的三种方法,选一种即可

// 使用当前数据库中的值,覆盖Linq缓存中实体对象的值
// occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);

// 使用Linq缓存中实体对象的值,覆盖当前数据库中的值
occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);

// 只更新实体对象中改变的字段的值,其他的保留不变
//occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
}
// 这个地方要注意,Catch方法中,我们前面只是指明了怎样来解决冲突,这个地方还需要再次提交更新,这样的话,值 //才会提交到数据库。
dbLinq.SubmitChanges();
}
ret = true;
}

}
catch (Exception ex)
{
ret = false;
throw new ApplicationException(ex.Message);
}
finally {
}
return ret;
}

其中,结构中除主键外其它都可以为NULL值,
听他们说使用
try
{
dbLinq.SubmitChanges();
}
catch (System.Data.Linq.ChangeConflictException)
{
foreach (System.Data.Linq.ObjectChangeConflict occ in dbLinq.ChangeConflicts)
{

//以下是解决冲突的三种方法,选一种即可

// 使用当前数据库中的值,覆盖Linq缓存中实体对象的值
// occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);

// 使用Linq缓存中实体对象的值,覆盖当前数据库中的值
occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);

// 只更新实体对象中改变的字段的值,其他的保留不变
//occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
}
// 这个地方要注意,Catch方法中,我们前面只是指明了怎样来解决冲突,这个地方还需要再次提交更新,这样的话,值 //才会提交到数据库。
dbLinq.SubmitChanges();
}
可以处理这个问题,但是还是提示:Row not found or changed错误,其实里面除了ID外其它值都是为NULL的空记录,为什么LINQ会对比到记录不存在或者变更呢?
...全文
387 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
那小x的传说 2013-03-16
  • 打赏
  • 举报
回复
问题尚未解决,只是换了个方式
NET小工 2012-11-26
  • 打赏
  • 举报
回复
引用 7 楼 hcf_force 的回复:
引用 6 楼 bianwo 的回复:引用 5 楼 hcf_force 的回复: 引用 3 楼 bianwo 的回复:40分真心少了点。 你那个三种方法都是在一开始就走错了路子,这不是一个Update操作,而是Delete。出现并发冲突就意味着两个以上的人在同时删除同一条记录,而这一堆Refresh方法刷新的都仅仅是该条记录的值而已,数据库中直接连该记录都没了,刷新……
我现在没法写代码实测,晚上给你试下
那小x的传说 2012-11-26
  • 打赏
  • 举报
回复
引用 6 楼 bianwo 的回复:
引用 5 楼 hcf_force 的回复: 引用 3 楼 bianwo 的回复:40分真心少了点。 你那个三种方法都是在一开始就走错了路子,这不是一个Update操作,而是Delete。出现并发冲突就意味着两个以上的人在同时删除同一条记录,而这一堆Refresh方法刷新的都仅仅是该条记录的值而已,数据库中直接连该记录都没了,刷新还有个鸟用,所以这三种方案都只适用于假删除的数据体系。 ……
三个都用过了,都不行,当结构字段不能为NULL的时候就可以删除,
NET小工 2012-11-26
  • 打赏
  • 举报
回复
引用 5 楼 hcf_force 的回复:
引用 3 楼 bianwo 的回复:40分真心少了点。 你那个三种方法都是在一开始就走错了路子,这不是一个Update操作,而是Delete。出现并发冲突就意味着两个以上的人在同时删除同一条记录,而这一堆Refresh方法刷新的都仅仅是该条记录的值而已,数据库中直接连该记录都没了,刷新还有个鸟用,所以这三种方案都只适用于假删除的数据体系。 正确的作法是这样的:……
我前面说过自己没测试过,那个mode的值你要自己选,我估计应该用keepchange这个值
那小x的传说 2012-11-24
  • 打赏
  • 举报
回复
引用 3 楼 bianwo 的回复:
40分真心少了点。 你那个三种方法都是在一开始就走错了路子,这不是一个Update操作,而是Delete。出现并发冲突就意味着两个以上的人在同时删除同一条记录,而这一堆Refresh方法刷新的都仅仅是该条记录的值而已,数据库中直接连该记录都没了,刷新还有个鸟用,所以这三种方案都只适用于假删除的数据体系。 正确的作法是这样的: catch { dbLinq.Refresh(Re……
大仙呀,你的方法有的单条记录是可以删除了,但是批量删除的时候那就又报这个错误了,还有其它方法吗?我查了并发处理的问题,也找不到方法
NET小工 2012-11-21
  • 打赏
  • 举报
回复
40分真心少了点。 你那个三种方法都是在一开始就走错了路子,这不是一个Update操作,而是Delete。出现并发冲突就意味着两个以上的人在同时删除同一条记录,而这一堆Refresh方法刷新的都仅仅是该条记录的值而已,数据库中直接连该记录都没了,刷新还有个鸟用,所以这三种方案都只适用于假删除的数据体系。 正确的作法是这样的: catch { dbLinq.Refresh(RefreshMode.OverwriteCurrentValues); dbLinq.SubmitChanges(); } 没实际测试了,如果最后不提交了,把那个传的参换个mode.
那小x的传说 2012-11-21
  • 打赏
  • 举报
回复
引用 3 楼 bianwo 的回复:
40分真心少了点。 你那个三种方法都是在一开始就走错了路子,这不是一个Update操作,而是Delete。出现并发冲突就意味着两个以上的人在同时删除同一条记录,而这一堆Refresh方法刷新的都仅仅是该条记录的值而已,数据库中直接连该记录都没了,刷新还有个鸟用,所以这三种方案都只适用于假删除的数据体系。 正确的作法是这样的: catch { dbLinq.Refresh(Re……[/quote [quote=引用 3 楼 bianwo 的回复:] 40分真心少了点。 你那个三种方法都是在一开始就走错了路子,这不是一个Update操作,而是Delete。出现并发冲突就意味着两个以上的人在同时删除同一条记录,而这一堆Refresh方法刷新的都仅仅是该条记录的值而已,数据库中直接连该记录都没了,刷新还有个鸟用,所以这三种方案都只适用于假删除的数据体系。 正确的作法是这样的: catch { dbLinq.Refresh(Re……
按照这位神仙的方法,还真行了,不过这香油分就是少了点,请不要介意,
那小x的传说 2012-11-20
  • 打赏
  • 举报
回复
引用 1 楼 q107770540 的回复:
单步调试~~
这CSDN的LINQ这里这么安静的,发贴回贴的人这么少?
q107770540 2012-11-19
  • 打赏
  • 举报
回复
单步调试~~
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧