2016-10-11 83 views
0

我正在把一個Excel前端與Access數據庫放在一起,以便我的一些同事可以整理來自以前項目的數據(無需學習使用Access自己!)添加記錄到Excel中的訪問 - 記錄集是隻讀

因此,我有一個Excel工作簿中的「數據」表,偶爾從數據庫刷新,然後是一個「儀表板」表,允許過濾該數據。

我遇到麻煩的地方在於關閉循環 - 允許將新數據輸入到數據庫中。相關代碼如下:

Private Sub btnDBImport_Click() 

Dim rst As ADODB.Recordset 
Dim errorList As String 

Dim cn As ADODB.Connection 
Set cn = New ADODB.Connection 
With cn 
    .Provider = "Microsoft.ACE.OLEDB.16.0" 
    .ConnectionString = "\\FileAddress\DB.accdb" 
    .Open 
End With 

Set rst = New ADODB.Recordset 
rst.CursorLocation = adUseServer 
rst.Open Source:="TableName", _ 
     ActiveConnection:=cn, _ 
     CursorType:=adOpenDynamic, _ 
     LockType:=adLockOptimistic, _ 
     Options:=adCmdTableDirect 


    If validationTest = False Then 
     errorList = errorList & "Data at row " & i & " was not added to the database due to missing information." & vbCrLf 
    Else 
     rst.AddNew 
     With rst 
      .Fields(1) = Value1 
      .Fields(2) = Value2 
     End With 
     rst.Update 
    End If 

Next i 

If errorList <> "" Then 
    MsgBox errorList, vbOKOnly, "Data error" 
End If 

rst.Close 
Set rst = Nothing 
cn.Close 
Set cn = Nothing 

End Sub 

以上是涉及定義,打開和處理記錄集的所有內容;我在rst.AddNew得到一個錯誤,因爲「無法更新,數據庫或對象是ReadOnly」。 任何幫助表示讚賞。

+1

您是否驗證過您是否可以通過Access將記錄添加到表中,或者數據庫是否可能在其他位置設置爲ReadOnly?另外,請嘗試'rst.CursorLocation = adUseClient',因爲Access始終在客戶端上運行。這是我偶然發現的,因爲我認爲adUseServer可能會讓你的RecordCount屬性 –

+1

哼。數據庫目前在Access中以只讀方式打開,因此我必須查看是否可以深入瞭解底層。謝謝吉米 –

回答

1

所以,感謝來自Jimmy Smith的評論,我已經深入瞭解了這一點,或者至少解決了我眼前的問題。

當通過MS Access直接訪問並使用VBA加載爲Recordset時,該表被視爲ReadOnly,因爲在同一個Excel工作簿中存在指向該表的鏈接。

既然我已經刪除了表的鏈接,而不是通過代碼更新其中的記錄,我一直在獲取對相關表的訪問級別,並且所有內容都按預期工作。有時間提交到Rubberduck並將其展示給用戶庫。