2013-08-05 35 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

相關問題