如何检查数据库中是否已存在值对?

时间:2014-10-03 09:32:37

标签: sql-server vb.net visual-studio-2012

在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) ThenOperator <= is not defined for types System.Data.DataSet and Integer

上给出了错误

我很难理解这个错误。我做错了什么?

1 个答案:

答案 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;

MERGEHOLDLOCK一起使用是我所知道的避免竞争条件的最佳方式,但它不能替代唯一约束。如果表中的值应该是唯一的,那么仍然应该使用约束强制执行此操作。然后,您可以简单地检查ExecuteNonQuery()的返回值,如果插入了行,它将返回1,如果该对已经存在,则返回0。

您还应该使用参数化查询!