【问题标题】:Recordset.Update Database or Object is read-onlyRecordset.Update 数据库或对象是只读的
【发布时间】:2013-12-06 18:26:36
【问题描述】:

不确定这是否适用于我想要的具体细节。场景是文本框填充了表格中的数据,用户编辑记录并单击按钮进行保存。

Dim cdb As DAO.Database, rstEdit As DAO.Recordset
Set cdb = CurrentDb
DataValues = "SELECT * FROM Companies, Link_Table WHERE Companies.CompanyID =  " & SelectedValue & ";"
Set rstEdit = CurrentDb.OpenRecordset(DataValues, dbOpenSnapshot)

With rstEdit
 OldCompanyName = !CompanyName
 OldCompanyDescription = !Description
 OldFriendlyName = !FriendlyName
 OldAddressLine1 = !AddressLine1
 OldAddressLine2 = !AddressLine2
 OldAddressLine3 = !AddressLine3
 OldTown = !Town
 OldPostcode = !AddressPostcode
 OldCounty = !AddressCounty
 OldMainTelephone = !MainTelephone
 OldMainEmail = !MainEmail
 OldWeb = !WebAddress

'不确定这是必要的。它在示例中被引用,但不确定为什么? ^'

 !CompanyName = NewCompanyName
 !Description = NewCompanyDescription
 !FriendlyName = NewFriendlyName
 !AddressLine1 = NewAddressLine1
 !AddressLine2 = NewAddressLine2
 !AddressLine3 = NewAddressLine3
 !Town = NewTown
 !AddressPostcode = NewPostcode
 !AddressCounty = NewCounty
 !MainTelephone = NewMainTelephone
 !MainEmail = NewMainEmail
 !WebAddress = NewWeb
 .Update
End With

但是,在单击保存按钮时,它会出错,指出数据库或对象是只读的,我不确定为什么。据我所知,它没有在任何地方开放,也不应该以任何理由开放!希望有人能够对这个问题有所了解。该表有一个主键集,即 CompanyID,但在例程中不使用它。

【问题讨论】:

    标签: sql ms-access vba recordset


    【解决方案1】:

    类型参数dbOpenSnapShot在:

    Set rstEdit = CurrentDb.OpenRecordset(DataValues, dbOpenSnapshot)
    

    使 rstEdit 作为只读记录集(或快照)打开。考虑改用dbOpenDynaset

    【讨论】:

    • 很好的答案!此外,请确保您拥有要更新的表的主键。那是我的另一个问题
    【解决方案2】:

    正如另一个答案中提到的,dbOpenSnapshot 选项会导致只读记录集。但是,一旦您更改了OpenRecordset 选项,您仍然会得到一个只读记录集。

    用作记录集源的查询在CompaniesLink_Table 之间包含一个implicit cross join。意味着Companies 中的每一行都与Link_Table 中的每一行匹配。这意味着 Access 会将查询视为只读,这反过来意味着记录集也将是只读的。

    在您明确定义JOIN 条件的查询设计器中构建和测试新查询。从简单的事情开始;省略WHERE 子句,直到你有一个工作的JOIN

    SELECT *
    FROM
        Companies
        INNER JOIN Link_Table
        ON Companies.link_field = Link_Table.link_field;
    

    注意事项:

    1. 如果这两个表不包含可以用作 link_field 的公共字段(或一组字段),那么这项任务将更具挑战性......您甚至可能不会能够打开可编辑的记录集。
    2. 如果JOIN 是一对多的,您应该可以编辑“多”侧表中的字段,但可能无法编辑“一”侧表中的字段JOIN

    【讨论】:

    • dbOpenDynaset 仍然存在同样的问题 打算研究一下这个问题,看看我是否能想出任何东西 仍然没有尝试新的查询......但是
    【解决方案3】:

    尝试在您的 OpenRecordset 方法中指定可编辑的 LockEdits 参数。

     Set recordset=object.OpenRecordset(source, type, options, lockedits)
    

    当您在OpenRecordset 方法的LockEdits 参数中使用以下常量之一时,您将创建一个可编辑的记录集:

    dbOptimistic, dbPessimistic, dbOptimisticValue, or dbOptimisticBatch
    

    来源 VBA:运行时错误“3027”使用 ODBCDirect 打开记录集:http://support.microsoft.com/kb/161252

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2017-07-28
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多