sql - 在将记录添加到数据库之前检查记录是否存在

标签 sql sql-server vba excel

VBA 中有没有一种方法可以在添加记录之前检查数据库中是否存在记录?

我试图在变量中捕获选择查询:

sSQL = "select count(*) from OptionRestriction where Feature_ID_1 = 1021 AND OptionValue_1 = 3 AND value = 0 AND Feature_ID_2 = 403 AND OptionValue_2 = 5 and visible = 1"

我在 if 语句中使用了变量来检查计数是否不是 1。如果语句为真,则应添加记录:

            If sSQL <> "1" Then
                conn.Execute "INSERT INTO OptionRestriction (Feature_ID_1, OptionValue_1, value, Feature_ID_2, OptionValue_2, visible) SELECT TOP(1) CF.FeatureID As Feature_ID_1, CF.OptionValue  As OptionValue_1, 0, OV.FeatureID As Feature_ID_2, OV.OptionValue  AS OptionValue_2, 1 From Value as CF Cross Join Value as OV INNER JOIN Feature f on CF.FeatureID = f.ID INNER JOIN Feature f_2 on OV.FeatureID = f_2.ID Where CF.Name = '" & Replace(s_OptionValue_1_s, "'", "''") & "' AND OV.Name = '" & Replace(s_OptionValue_2_s, "'", "''") & "'"
            End If

但是,这在 VBA 中不起作用。有什么想法可以让我完成这项工作吗?

更新

根据 Vityata 的评论,我做了以下更改:

我添加了一个功能:

Public Function RestrictionCount() As Long
     RestrictionCount = DCount("Feature_ID_1", "OptionRestriction", "Feature_ID_1 = 1023 AND OptionValue_1 AND value = 0  AND Feature_ID_2 = 403 AND optionValue_2 = 5 AND visible = 1")
End Function

并在我的 if 所在的代码中使用了函数:

Private Sub CommandButton1_Click()

   Dim conn              As New ADODB.Connection
   conn.Open             "<string to connect to DB. Not displayed here due to confidentiality reasons>"


            If RestrictionCount() <> 1 Then
                conn.Execute "INSERT INTO OptionRestriction (Feature_ID_1, OptionValue_1, value, Feature_ID_2, OptionValue_2, visible) SELECT TOP(1) CF.FeatureID As Feature_ID_1, CF.OptionValue  As OptionValue_1, 0, OV.FeatureID As Feature_ID_2, OV.OptionValue  AS OptionValue_2, 1 From Value as CF Cross Join Value as OV INNER JOIN Feature f on CF.FeatureID = f.ID INNER JOIN Feature f_2 on OV.FeatureID = f_2.ID Where CF.Name = '" & Replace(s_OptionValue_1_s, "'", "''") & "' AND OV.Name = '" & Replace(s_OptionValue_2_s, "'", "''") & "'"
            End If

End Sub

现在我收到一个编译错误,指出未定义子或函数,而 DCount 位于另一个函数中。有没有办法解决这个问题?抱歉我的问题(我是 VBA 新手)。

更新

由于 Vityata 的最后评论,现在可以执行检查。现在的代码如下,包括我用来将数据添加到数据库的循环:

    rs.ActiveConnection = conn
    rs.Open "select * from OptionRestriction where Feature_ID_1 = 1021 AND OptionValue_1 = 3 AND value = 0 AND Feature_ID_2 = 403 AND OptionValue_2 = 5 and visible = 1"

    i = 2
    Do Until IsEmpty(Cells(i, 1))
        s_OptionValue_1_s = ActiveSheet.Cells(i, 1)
        value_s = ActiveSheet.Cells(i, 2)
        s_OptionValue_2_s = ActiveSheet.Cells(i, 3)

        If value_s <> "" Then

            If rs.RecordCount <> 1 Then
                conn.Execute "INSERT INTO OptionRestriction (Feature_ID_1, OptionValue_1, value, Feature_ID_2, OptionValue_2, visible) SELECT TOP(1) CF.FeatureID As Feature_ID_1, CF.OptionValue  As OptionValue_1, 0, OV.FeatureID As Feature_ID_2, OV.OptionValue  AS OptionValue_2, 1 From Value as CF Cross Join Value as OV INNER JOIN Feature f on CF.FeatureID = f.ID INNER JOIN Feature f_2 on OV.FeatureID = f_2.ID Where CF.Name = '" & Replace(s_OptionValue_1_s, "'", "''") & "' AND OV.Name = '" & Replace(s_OptionValue_2_s, "'", "''") & "'"
            End If

            conn.Execute "INSERT INTO OptionRestriction (Feature_ID_1, OptionValue_1, value, Feature_ID_2, OptionValue_2, visible) SELECT TOP(1) CF.FeatureID As Feature_ID_1, CF.OptionValue  As OptionValue_1, '" & Replace(value_s, "'", "''") & "', OV.FeatureID As Feature_ID_2, OV.OptionValue  AS OptionValue_2, 0 From Value as CF Cross Join Value as OV INNER JOIN Feature f on CF.FeatureID = f.ID INNER JOIN Feature f_2 on OV.FeatureID = f_2.ID Where CF.Name = '" & Replace(s_OptionValue_1_s, "'", "''") & "' AND OV.Name = '" & Replace(s_OptionValue_2_s, "'", "''") & "'"
        Else
            conn.Execute "INSERT INTO OptionRestriction (Feature_ID_1, OptionValue_1, value, Feature_ID_2, OptionValue_2, visible) SELECT TOP(1) CF.FeatureID As Feature_ID_1, CF.OptionValue  As OptionValue_1, 1, OV.FeatureID As Feature_ID_2, OV.OptionValue  AS OptionValue_2, 0 From Value as CF Cross Join Value as OV INNER JOIN Feature f on CF.FeatureID = f.ID INNER JOIN Feature f_2 on OV.FeatureID = f_2.ID Where CF.Name = '" & Replace(s_OptionValue_1_s, "'", "''") & "' AND OV.Name = '" & Replace(s_OptionValue_2_s, "'", "''") & "'"
            conn.Execute "INSERT INTO OptionRestriction (Feature_ID_1, OptionValue_1, value, Feature_ID_2, OptionValue_2, visible) SELECT TOP(1) CF.FeatureID As Feature_ID_1, CF.OptionValue  As OptionValue_1, 0, OV.FeatureID As Feature_ID_2, OV.OptionValue  AS OptionValue_2, 1 From Value as CF Cross Join Value as OV INNER JOIN Feature f on CF.FeatureID = f.ID INNER JOIN Feature f_2 on OV.FeatureID = f_2.ID Where CF.Name = '" & Replace(s_OptionValue_1_s, "'", "''") & "' AND OV.Name = '" & Replace(s_OptionValue_2_s, "'", "''") & "'"
        End If

    i = i + 1
    Loop

数据库中的结果现在是:

enter image description here

然而,选择的行不应该在那里。所以它只需要添加 1021 - 3 - 0 - 403 - 5 - 1 一次。为了实现这一点,我需要在循环中进行哪些更改?

将数据插入数据库的 excel 文件如下所示:

enter image description here

最佳答案

如果您在 工作微软 Excel ,这是您可以使用的示例:

Public Sub CheckDataInSQLServer()

    Dim cnLogs              As Object
    Dim rsData              As Object

    On Error GoTo CheckDataInSQLServer_Error

    Set cnLogs = CreateObject("ADODB.Connection")
    Set rsData = CreateObject("ADODB.Recordset")

    cnLogs.Open ConnectionString 'this is a string function

    rsData.ActiveConnection = cnLogs
    rsData.Open "SELECT * FROM A WHERE B = C;"

    If rsData.EOF Then
        debug.print "no values"
    Else    
        debug.print "has values"
    End If    

End Sub

在 VBA 中,您需要的函数称为 DCount , 如果您使用 微软访问 :

您可以使用 DCount 函数来确定指定记录集(域)中的记录数。使用 Visual Basic 中的 DCount 函数、宏、查询表达式或计算控件。例如,您可以在模块中使用 DCount 函数来返回 Orders 表中与在特定日期下达的订单相对应的记录数。
MSDN

查看更多如何使用 DCount - DCount with 2 criteria

这是如何构建 DCount 的示例在一个函数中并使用它:

Public Function OrdersCount(ByVal strCountry As String, ByVal dteShipDate As Date) As Long
    OrdersCount = DCount("[ShippedDate]", "Orders", _
                  "[ShipCountry] = '" & strCountry & _
                  "' AND [ShippedDate] > #" & dteShipDate & "#")
End Function

If OrdersCount("Bulgaria", Now()) = 0 then
    'Execute the SQL query.
End if

关于sql - 在将记录添加到数据库之前检查记录是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46112400/

相关文章:

sql - 重复使用相同的查询,但只更新嵌套变量的值

php - MySQL 获取上个月而不是特定周

sql-server - 使用和不使用主键的 SQL Server 插入性能

sql-server - 在 linux VM 上托管的 sql server 上恢复备份

regex - 使用 word VBA 正则表达式提取文本,然后将其作为字符串保存到变量中

mysql - 关于having 子句和where 子句的问题

python - 使用 python 从 MYSQL 数据库中显示随机抽认卡

sql - 有没有办法使用 Windows 身份验证为 ms sql 显式指定 u/p?

vba - 预期错误只能是 440/自动化错误?

excel - VBA、电子邮件、ActiveX 组件无法创建对象