读书人

可能是并发引起的异常 Row not found

发布时间: 2013-03-17 13:48:32 作者: rapoo

可能是并发引起的错误 Row not found or changed,怎样处理
本帖最后由 hcf_force 于 2012-11-19 14:39:49 编辑

  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会对比到记录不存在或者变更呢?
[解决办法]
单步调试~~
[解决办法]

引用:
引用:40分真心少了点。

你那个三种方法都是在一开始就走错了路子,这不是一个Update操作,而是Delete。出现并发冲突就意味着两个以上的人在同时删除同一条记录,而这一堆Refresh方法刷新的都仅仅是该条记录的值而已,数据库中直接连该记录都没了,刷新还有个鸟用,所以这三种方案都只适用于假删除的数据体系。

正确的作法是这样的:……


我前面说过自己没测试过,那个mode的值你要自己选,我估计应该用keepchange这个值
[解决办法]
引用:
引用:引用:
引用:40分真心少了点。

你那个三种方法都是在一开始就走错了路子,这不是一个Update操作,而是Delete。出现并发冲突就意味着两个以上的人在同时删除同一条记录,而这一堆Refresh方法刷新的都仅仅是该条记录的值而已,数据库中直接连该记录都没了,刷新……


我现在没法写代码实测,晚上给你试下

读书人网 >.NET

热点推荐