Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新行时的并发冲突问题_C#_.net_Vb.net - Fatal编程技术网

C# 更新行时的并发冲突问题

C# 更新行时的并发冲突问题,c#,.net,vb.net,C#,.net,Vb.net,T_MemTypeAdvanceBooking表有以下列: CentreID Int PrimaryKey MembershipType Uniqueindentifier PrimaryKey FacilityName UniqueIdentifier PrimaryKey ActivityName NvarChar(35) PrimaryKey NumOfAdv

T_MemTypeAdvanceBooking表有以下列:

CentreID                Int               PrimaryKey
MembershipType          Uniqueindentifier PrimaryKey
FacilityName            UniqueIdentifier  PrimaryKey
ActivityName            NvarChar(35)      PrimaryKey
NumOfAdvanceDaysBooking smallint
我知道拥有这些主键听起来可能很傻,但在我的应用程序中,当我填充所有键并插入时,就可以了!但是,当我尝试用不同的NumOfAdvancedDaysBooking值更新一行时,它抛出了ConcurrencyViolation异常,这是怎么回事?对我来说,这有什么解决办法? 此处是iste Update命令:

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));"

删除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));"
说明:

当您在DataTable中更新DataRow时,实际上会得到2行。一个是当前的,另一个是原始的。大多数情况下,您都使用当前版本的DataRow。所以,当您发送更新的行(通常通过DataAdapter)时,RowVersion不等于Original,而是Current。然后发生的情况是,条件为false,并且数据库中没有更新任何记录。DataAdapter获取未更新任何记录的信息,并认为有人在您之前更新了该记录并引发并发异常

我建议您在表中添加Integer类型的列版本。插入时,将版本设置为1。在每次后续更新时,将版本增加1。这样,在发出DB UPDATE语句时,只需将获取的版本值(@Original_Version)与实际版本值([Version])进行比较,就可以检查乐观并发性

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));"

除了看到桌子的结构之外,没有什么可以做的。您是如何执行更新的?应用程序是多用户的吗?dataadapter的UpdateCommand正在运行的代码是什么?Me.sqlUpdateCommand 1.CommandText=“UPDATE[T_MemTypeAdvanceBooking]SET[CentreId]&[uU”]=@CentreId、[MembershipTypeId]=@MembershipTypeId、[MAIN FACILITY USED]=@M”&[uUu”AIN_FACILITY\u USED、[ActivityType]=@ActivityType、[NumOfAdvanceDays]=@NumOfAd”&\u“Vanceday,其中([CentreId]=@Original_CentreId)和([MembershipTypeId]=@或“&_”Original_MembershipTypeId)和“&_”([ActivityType]=@Original_ActivityType)和([RowVer]=@Original_RowVe”&r));“但是并发性问题呢?它不影响条件吗?