操作必须使用可更新查询/SQL - VBA

Posted

技术标签:

【中文标题】操作必须使用可更新查询/SQL - VBA【英文标题】:Operation must use an Updateable Query / SQL - VBA 【发布时间】:2013-08-05 12:04:19 【问题描述】:

我正在尝试创建一个非常动态的宏,它将根据用户的选择更新数据库中的不同表。当然,每个表都有不同的标题和信息。我在更新时遇到问题(当用户将新记录添加到旧表时)。这是代码的一部分,问题是当它到达“.update”时,我得到“操作必须使用可更新查询”错误。

Dim DBCnn As ADODB.Connection
Dim RecSet As ADODB.Recordset
Dim sQRY As String
Dim FilePath, Titulo, Tabla As String
Dim LastRow, LastColumn, TotalRecords, Id As Long

Set DBCnn = New ADODB.Connection
Set RecSet = New ADODB.Recordset
DBCnn.Mode = adModeReadWrite
DBCnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & FilePath & ";"

sQRY = "SELECT * FROM Customers" & Tabla ' & " WHERE PopID = " & lngid

RecSet.CursorLocation = adUseClient
RecSet.Open _
    Source:=sQRY, _
    ActiveConnection:=DBCnn, _
    CursorType:=adOpenDynaset, _
    LockType:=adLockOptimistic


Do While Range("A" & LastRow).Value <> ""
' repeat until first empty cell in column A
With RecSet
    .AddNew
    .Fields("Id") = Range("A" & LastRow).Value
    .Fields("Name") = Range("B" & LastRow).Text
    .Fields("Age") = Range("C" & LastRow).Value
    .Update '(Here's my error)
End With
LastRow = LastRow + 1
Loop

【问题讨论】:

您的数据库文件“.accdb”是什么类型的?它不是开放的还是受保护的?你的代码看起来不错,除了我不认识的CursorType:=adOpenDynaset - 它不应该是adOpenDynamic吗?? 据我所知它没有受到保护,我在它关闭时运行它。另外,我将其更改为动态,它仍然无法正常工作:( 你的数据库是什么类型的? 它只是一个访问数据库 所以,除了 DBCnn.ModeRecSet.CursorLocation 在我的情况下具有默认值外,我使用了类似的代码。但是我用我的代码检查了你的设置,看来你的代码是正确的。在我看来,您的数据库/表设置有问题。 【参考方案1】:

放弃这一行:

RecSet.CursorLocation = adUseClient

或者试试这样:

RecSet.CursorLocation = adUseServer

请参阅 MSDN 上 CursorLocation Property (ADO) 的备注部分:

“如果 CursorLocation 属性设置为 adUseClient,则记录集将以只读方式访问,并且无法对主机进行记录集更新。 "

【讨论】:

【参考方案2】:

您在此处连接一个字符串 - "SELECT * FROM Customers" & Tabla ,但我看不到在哪里提供了 Tabla。

您是否尝试过直接在 Access 中运行查询? 另外,您是否尝试过更改光标类型? http://www.w3schools.com/ado/prop_rs_cursortype.asp

【讨论】:

以上是关于操作必须使用可更新查询/SQL - VBA的主要内容,如果未能解决你的问题,请参考以下文章

Oledb 异常未处理。操作必须使用可更新的查询

VBA Excel - 访问查询不可更新

更新行给出错误操作必须使用可更新查询

悖论数据库的java更新查询

Access 2016 - 简单更新查询给出“操作必须使用可更新查询”错误

Paradox 插入数据操作必须使用可更新查询