同时执行插入和更新dataset时出现“违反并发性”,如何解决?
如下代码:
For i As Integer = 1 To weaTypes.Length
For j As Integer = 1 To names.Length
For k As Integer = 1 To Tlevs.Length
'首先添加日期, 名称的空记录
TmpSql = "forecastdate=#" + nowDate.ToShortDateString + "# and " + "weatherType='" + weaTypes(i - 1) + "' and AreaName='" + names(j - 1) + "'"
fcDR = basinDS.Tables("yb").NewRow
If basinDS.Tables("yb").Select(TmpSql).Count = 0 Then
fcDR(1) = nowDate.ToShortDateString : fcDR(2) = names(j - 1) : fcDR(3) = weaTypes(i - 1)
basinDS.Tables("yb").Rows.Add(fcDR)
acsDA.Update(basinDS.Tables("yb"))
End If
basinDS.Tables("yb").Select(TmpSql)(0)(k + 3) = "F0"
acsDA.Update(basinDS.Tables("yb"))
Next
Next
Next
目的是首先检索数据库记录的记录标识(日期,类型,名字),如果没有符合的记录则添加一个记录标识,然后更新剩余的列值;如果有符合的记录则直接更新剩余的列值,但是在添加了第一个记录的标识后马上更新剩余列值时就提示:“违反并发性”,请问如何解决?
[解决办法]
- VB.NET code
For i As Integer = 1 To weaTypes.Length For j As Integer = 1 To names.Length For k As Integer = 1 To Tlevs.Length '首先添加日期, 名称的空记录 TmpSql = "forecastdate=#" + nowDate.ToShortDateString + "# and " + "weatherType='" + weaTypes(i - 1) + "' and AreaName='" + names(j - 1) + "'" If basinDS.Tables("yb").Select(TmpSql).Count = 0 Then fcDR = basinDS.Tables("yb").NewRow fcDR(1) = nowDate.ToShortDateString : fcDR(2) = names(j - 1) : fcDR(3) = weaTypes(i - 1) basinDS.Tables("yb").Rows.Add(fcDR) End If basinDS.Tables("yb").Select(TmpSql)(0)(k + 3) = "F0" acsDA.Update(basinDS.Tables("yb")) Next Next Next
[解决办法]
改写dataset里面每一个datatable的update语句,把where后面的条件大多数去掉,只保留主键=@主键.这样就不会涉及到全表更新了。