并发冲突问题

问题描述:

T_MemTypeAdvanceBooking表中有这些列:并发冲突问题

CentreID    Int    PrimaryKey 
MembershipType   Uniqueindentifier PrimaryKey 
FacilityName   UniqueIdentifier PrimaryKey 
ActivityName   NvarChar(35)  PrimaryKey 
NumOfAdvanceDaysBooking smallint 

我知道可能会为拥有这些主键听起来很傻,但在我的应用程序时,我填写的所有按键和我做一个插入,它没问题!但是当我尝试用NumOfAdvancedDaysBooking的不同的值更新行,它抛出ConcurrencyViolation之外,怎么是这样的?对我来说这是什么修复? 这里ISTE更新命令:

Me.SqlUpdateCommand1.CommandText = "UPDATE [T_MemTypeAdvanceBooking] SET [CentreId" & _ 
    "] = @CentreId, [MembershipTypeId] = @MembershipTypeId, [MAIN FACILITY USED] = @M" & _ 
    "AIN_FACILITY_USED, [ActivityType] = @ActivityType, [NumOfAdvanceDays] = @NumOfAd" & _ 
    "vanceDays WHERE (([CentreId] = @Original_CentreId) AND ([MembershipTypeId] = @Or" & _ 
    "iginal_MembershipTypeId) AND" & _ 
    "([ActivityType] = @Original_ActivityType) AND ([RowVer] = @Original_RowVe" & _ 
    "r));" 
+0

没有人??????????? – Bahman 2011-04-16 10:40:09

+0

没有看到的不仅仅是表结构更没有什么去。你如何执行更新? – MartW 2011-04-16 10:45:03

+0

数据适配器的课程! – Bahman 2011-04-16 10:55:57

删除RowVer条件:

Me.SqlUpdateCommand1.CommandText = "UPDATE [T_MemTypeAdvanceBooking] SET [CentreId" & _ 
    "] = @CentreId, [MembershipTypeId] = @MembershipTypeId, [MAIN FACILITY USED] = @M" & _ 
    "AIN_FACILITY_USED, [ActivityType] = @ActivityType, [NumOfAdvanceDays] = @NumOfAd" & _ 
    "vanceDays WHERE (([CentreId] = @Original_CentreId) AND ([MembershipTypeId] = @Or" & _ 
    "iginal_MembershipTypeId) AND" & _ 
    "([ActivityType] = @Original_ActivityType));" 

说明:

当您在数据表更新的DataRow你实际上得到2行。一个与DataRowVersion当前和另一个与原始。大多数时候您使用当前版本的DataRow。因此,当您发送更新的行时(通常通过DataAdapter)RowVersion不等于原始,但当前。接下来会发生的情况是该条件是错误的,并且数据库中没有记录被更新。 DataAdapter获取没有记录更新的信息,并认为某人更新了您之前的记录并引发了并发异常。

我建议你对你的表型整数列版本添加。当插入您设置版本为1。在每一个后续更新您可以通过1递增版本这样你就可以通过只比较牵强版本值(@Original_Version)与实际版本值([版本])发行时DB更新检查乐观并发声明。

Me.SqlUpdateCommand1.CommandText = "UPDATE [T_MemTypeAdvanceBooking] SET [CentreId" & _ 
    "] = @CentreId, [MembershipTypeId] = @MembershipTypeId, [MAIN FACILITY USED] = @M" & _ 
    "AIN_FACILITY_USED, [ActivityType] = @ActivityType, [NumOfAdvanceDays] = @NumOfAd" & _ 
    "vanceDays WHERE (([CentreId] = @Original_CentreId) AND ([MembershipTypeId] = @Or" & _ 
    "iginal_MembershipTypeId) AND" & _ 
    "([ActivityType] = @Original_ActivityType) AND ([Version] = @Original_Version));" 
+0

究竟是什么导致了这个错误,Petar呢? – Bahman 2011-04-16 12:26:25

+0

但是并发问题呢?这不是困扰条件吗? – Bahman 2011-04-16 12:38:38

+0

新增说明。 – 2011-04-16 15:55:23