如何使用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 - 如果新的或更新的重复记录则插入活动记录