2013-12-06 3 views
4

Не уверен, что это будет работать в специфических целях. Сценарий - это текстовые поля, заполненные данными из таблицы, и пользователь редактирует записи и нажимает кнопку для сохранения.База данных Recordset.Update или объект доступен только для чтения

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, однако это не используется в подпрограмме.

ответ

0

Попробуйте указать редактируемый аргумент LockEdits в вашем методе OpenRecordset.

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

Вы создаете редактируемый записей при использовании одного из следующих констант в LockEdits аргумента OpenRecordset метода:

dbOptimistic, dbPessimistic, dbOptimisticValue, or dbOptimisticBatch 

Источник VBA: Run-Time Error '3027' Использование ODBCDirect Открыть RecordSet: http://support.microsoft.com/kb/161252

3

Параметр Тип dbOpenSnapShot в:

Set rstEdit = CurrentDb.OpenRecordset(DataValues, dbOpenSnapshot) 

делает rstEdit открытым как набор записей только для чтения (или моментальный снимок). Вместо этого используйте вместо этого dbOpenDynaset.

+1

Отличный ответ! Кроме того, убедитесь, что у вас есть первичный ключ для таблицы, которую вы хотите обновить. Это была моя другая проблема. –

2

Как указано в другом ответе, опция dbOpenSnapshot приводит к набору записей только для чтения. Однако, как только вы измените опцию OpenRecordset, вы все равно останетесь с набором записей только для чтения.

Запрос, используемый в качестве источника набора записей, содержит implicit cross join между Companies и Link_Table. Средство означает, что каждая строка от 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 ,
+0

По-прежнему та же проблема с 'dbOpenDynaset'. Идя на исследование этого немного и посмотрим, смогу ли я придумать что-нибудь еще, не пробовав новый запрос ... еще –

Смежные вопросы