在VB.Net中,我试图检查数据库中是否已存在某个值对。如果没有,则需要添加:
Public Shared Sub updateChoice(ByVal dbConn As NS.DBConn, ByVal Y As String, ByVal Z As Int32)
'check if the Y <=> Z pair already exists
Dim sqlText As String = "select from table where X = " & CStr(Y)" and Y =" &CStr(Z)
Dim pairExists = dbConn.ExecuteAsDataSet(sqlText)
If (pairExists <= 0) Then
Dim sqlText As String = "insert into table ..." ' Insert pair into DB
dbConn.ExecuteNonQuery(sqlText)
End If
End Sub
Visual Studio在If (pairExists <= 0) Then
:Operator <= is not defined for types System.Data.DataSet and Integer
我很难理解这个错误。我做错了什么?
答案 0 :(得分:0)
在相同的参数中进行检查和插入会更有效,它还可以通过缩短检查和插入之间的时间来显着降低满足race condition的机会。您想要的陈述是:
MERGE Table WITH (HOLDLOCK) AS t
USING (VALUES (@X, @Y)) AS s (X, Y)
ON s.X = t.X
AND s.X = t.Y
WHEN NOT MATCHED THEN INSERT (X, Y) VALUES (X, Y)
OUTPUT $action;
将MERGE
与HOLDLOCK
一起使用是我所知道的避免竞争条件的最佳方式,但它不能替代唯一约束。如果表中的值应该是唯一的,那么仍然应该使用约束强制执行此操作。然后,您可以简单地检查ExecuteNonQuery()
的返回值,如果插入了行,它将返回1,如果该对已经存在,则返回0。
您还应该使用参数化查询!