2013-08-05 34 views
3

我想创建一个非常动态的宏,它将更新数据库中的不同表,具体取决于用户选择的内容。每张表格当然有不同的标题和信息。我遇到更新问题(当用户向旧表添加新记录时)。这是代码的一部分,问题是它到达“.update”时,我得到“操作必须使用可更新查询”错误。操作必须使用可更新的查询/ SQL - VBA

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 
+0

什么类型是您的数据库文件“.accdb”?是不是打开或保护?你的代码看起来很好,除了'CursorType:= adOpenDynaset'我不认识 - 它不应该是'adOpenDynamic'? –

+0

据我所知,它不受保护,我在关闭时运行它。另外,我将它更改为Dynamic并且它仍然不起作用:( – Cardonai

+0

数据库是什么类型? –

回答

1

放弃这一行:

RecSet.CursorLocation = adUseClient 

或者尝试像这样代替:

RecSet.CursorLocation = adUseServer 

见注释部分在CursorLocation Property (ADO) MSDN上:

“如果的CursorLocation属性设置为adUseClient,记录集将以只读方式访问,并且记录集更新到主机是不可能的。“

0

你们在连接字符串 - “SELECT * FROM客户” &塔不拉,但我没有看到所提供塔布拉是哪里。

您是否尝试过直接在Access中运行查询?
另外,你有没有尝试改变cursortype呢? http://www.w3schools.com/ado/prop_rs_cursortype.asp

相关问题