Recordset.Update数据库或对象是只读的

时间:2013-12-06 18:26:37

标签: sql vba ms-access access-vba recordset

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

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,但是在例程中没有使用它。

3 个答案:

答案 0 :(得分:3)

类型参数dbOpenSnapShot位于:

Set rstEdit = CurrentDb.OpenRecordset(DataValues, dbOpenSnapshot)

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

答案 1 :(得分: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
  3. 的一面

答案 2 :(得分:0)

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

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

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

dbOptimistic, dbPessimistic, dbOptimisticValue, or dbOptimisticBatch

来源 VBA:运行时错误'3027'使用ODBCDirect打开RecordSet:http://support.microsoft.com/kb/161252