2016-10-11 68 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并将其展示给用户库。