如何使用ID检查记录,如果记录存在则更新如果不添加新记录

Posted

技术标签:

【中文标题】如何使用ID检查记录,如果记录存在则更新如果不添加新记录【英文标题】:How to check for record by using ID, then if record exists update if not add new record 【发布时间】:2014-02-11 15:30:01 【问题描述】:

我创建了一个 Excel 用户表单来收集数据。我已将其连接到 Access 以转储数据。但是,我想在每次用户按下提交按钮时更新 Access。

基本上我需要 Select 语句来确定 id 是否存在,如果它不存在,我需要使用 INSERT 添加新行。我对任何 SQL 都很陌生,所以任何帮助都会很棒。

这是我现在拥有的代码,我需要将其改编为 ADO。

Sub Update()
Dim cnn As ADODB.Connection
Dim MyConn
Dim rst As ADODB.Recordset
Dim StrSql As String

Set cnn = New ADODB.Connection
MyConn = ThisWorkbook.Path & Application.PathSeparator & TARGET_DB

With cnn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .Open MyConn

Set rst = New ADODB.Recordset
rst.CursorLocation = adUseServer
rst.Open Source:="Foam", ActiveConnection:=cnn, _
        CursorType:=adOpenDynamic, LockType:=adLockOptimistic, _
        Options:=adCmdTable





StrSql = "SELECT * FROM Foam WHERE FoamID = " & txtMyID
Set rst = CurrentDb.OpenRecordset(StrSql, dbOpenDynaset)

If (rst.RecordCount = 0) Then
     DoCmd.RunSQL "INSERT INTO Foam (ID, Part, Job, Emp, Weight, Oven) VALUES " & _
          "(" & txtID & ", '" & txtField1 & "', '" & txtField2 & "', '" & txtField3 & "', '" & txtField4 & "', '" & txtField5 & "' );"

End If

 ' Close the connection
    rst.Close
    cnn.Close
    Set rst = Nothing
    Set cnn = Nothing


End With

End Sub

【问题讨论】:

【参考方案1】:

我修改了您的代码示例,使其能够在我的系统上运行,并在 Excel 2007 中测试了这个版本。

当我使用与现有记录的id 匹配的lngId 值时,该记录会在记录集中打开,我可以更新其字段的值。

lngId 与现有记录的id 不匹配时,记录集打开为空[(.BOF And .EOF) = True]。在这种情况下,我会添加一条新记录并向其中添加字段值。

Sub Update()
    Const TARGET_DB As String = "database1.mdb"
    Dim cnn As ADODB.Connection
    Dim MyConn As String
    Dim rst As ADODB.Recordset
    Dim StrSql As String
    Dim lngId As Long

    Set cnn = New ADODB.Connection
    MyConn = ThisWorkbook.Path & Application.PathSeparator & TARGET_DB
    With cnn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .Open MyConn
    End With

    lngId = 4
    StrSql = "SELECT * FROM tblFoo WHERE id = " & lngId
    Set rst = New ADODB.Recordset
    With rst
        .CursorLocation = adUseServer
        .Open Source:=StrSql, ActiveConnection:=cnn, _
                CursorType:=adOpenDynamic, LockType:=adLockOptimistic, _
                Options:=adCmdText
        If (.BOF And .EOF) Then
            ' no match found; add new record
            .AddNew
            !ID = lngId
            !some_text = "Hello World"
        Else
            ' matching record found; update it
            !some_text = "Hello World"
        End If
        .Update
        .Close
    End With

    Set rst = Nothing
    cnn.Close
    Set cnn = Nothing
End Sub

【讨论】:

excel 2013 是否需要进行重大更改?我收到“错误 3265 项目在与请求的名称或序号相对应的集合中找不到。” !some+text = "Hello World" 触发此错误 some_text 是我的tblFoo 表中的字段名称。替换您的字段名称。如果该名称包含空格、标点符号或除字母、数字或_ 以外的任何字符,请将字段名称括在方括号中,如下所示...![your field] 非常感谢!我实际上已经从一个 excel 用户表单更新了我的访问数据库!现在我只需要从文本字段而不是静态值填充数据库的更新。但你让我非常接近!谢谢!【参考方案2】:

使用VBA,这里有一个示例,说明如何查询某个ID 以检查它是否存在。如果没有,则通过INSERT 语句添加它:

Dim rs As DAO.Recordset
Dim StrSql As String

StrSql = "SELECT * FROM MyTable WHERE ID = " & txtMyID
Set rs = CurrentDb.OpenRecordset(StrSql, dbOpenDynaset)

If (rs.RecordCount = 0) Then
  DoCmd.RunSQL "INSERT INTO MyTable (ID, Field1, Field2) VALUES " & _
           "(" & txtID & ", '" & txtField1 & "', '" & txtField2 & "');"
End If

【讨论】:

如何将101,Whatever,Man)改成新添加的数据? @user3297842,我更新了我的答案以解决您的第一条评论。 由于某种原因,这条线有问题。设置 rst = CurrentDb.OpenRecordset(StrSql, dbOpenDynaset) 是 Currentdb 的问题,是我需要个性化的东西吗? 它告诉我需要对象并给我一个 424 错误

以上是关于如何使用ID检查记录,如果记录存在则更新如果不添加新记录的主要内容,如果未能解决你的问题,请参考以下文章

检查记录是不是存在,如果是,则“更新”,如果不“插入”

SQL Select:如果存在则更新,如果不存在则插入 - 使用日期部分比较?

CodeIgniter - 如果新的或更新的重复记录则插入活动记录

如果 mysql 数据库中的表中不存在,则更新或插入多条记录

如果 id 存在则更新,否则插入 (ODBC)

MS SQL 2008/Access 2002 VBA - 检查数据库的当前记录,如果不存在则输入