VBA Excel и Access — Добавление вложения к определенной записи в Access

#excel #vba #ms-access #attachment

Вопрос:

У меня есть файл Excel, который считывает и записывает данные для доступа. Я хочу иметь возможность добавлять вложения в определенные записи. До сих пор мне удавалось писать код, который добавляет вложение к новой записи в нужной таблице. Однако мне не удается добавить вложение в определенную запись. Вот код в Excel VBA:

 Public adodbConnectionString As String
Public adodbConnection As ADODB.Connection
Public adodbRecordset As ADODB.Recordset
Public daoDB As DAO.database
Public daoWS As DAO.Workspace
Public daoRecordset As DAO.Recordset
Public daoRecordset2 As DAO.Recordset
Public daoFields2 As DAO.Field2

Public Function refreshPath() 'this function updates the path to the .accdb-file globally

pathDb = "[...]Data.accdb"

End Function
Sub exportAttachmentToAccess() ' this function adds the attachment to the table

refreshPath

Dim filePath As String

filePath = SelectFile()

If Len(filePath) = 0 Then
    Debug.Assert "No file selected!"
    Exit Sub
End If

Set daoWS = DBEngine.Workspaces(0)
Set daoDB = OpenDatabase(pathDb)
Set daoRecordset = daoDB.OpenRecordset("SELECT * FROM N_C_A;", dbOpenDynaset)

daoRecordset.AddNew
    Set daoRecordset2 = daoRecordset.Fields("Test1").value 'Test1 is the field name where the attachments are stored
    
    daoRecordset2.AddNew
        daoRecordset2.Fields("FileData").LoadFromFile filePath
    daoRecordset2.Update

daoRecordset.Update

daoRecordset.Close
Set daoRecordset = Nothing
Set daoDB = Nothing

End Sub
 

Это таблица доступа:

Как вы можете видеть, вложения попадают в новую запись каждый раз, когда я запускаю макрос. Однако, когда я изменяю набор записей Daorecord.Добавьте новое в набор записей Daorecord.Отредактируйте его, добавив вложение к первой записи.

Как добавить вложение в идентификатор 12, т. е. в четвертую запись?

Комментарии:

1. "SELECT * FROM N_C_A where id = 12" будет запрашиваться только запись, которую вы хотите обновить. Аналогично, при добавлении новых записей вы можете использовать "SELECT * FROM N_C_A where false" , так как для добавления новой записи вам нужен только пустой набор записей.

Ответ №1:

Сохранение объектов в таблице требует ограничения размера доступа 2 ГБ. Часто лучше оставлять вложения внешними и сохранять путь в текстовом поле.

Опции:

  1. примените фильтр в SQL, чтобы открыть набор записей Daorecord только с записью, которую необходимо обновить
 daoDB.OpenRecordset("SELECT * FROM N_C_A WHERE ID =" amp; Me!ID, dbOpenDynaset)
 
  1. используйте метод поиска набора записей, чтобы перейти к нужной записи
 daoRecordset.FindFirst "ID = " amp; Me!ID
If Not daoRecordset.NoMatch Then
    'code to add attachment
End If
 

Комментарии:

1. Спасибо вам за ваше предложение. Рассмотрев размер вложений, я понимаю, что эти 2 Гб будут использованы довольно быстро. Я сохраню их снаружи и сохраню путь к изображению в доступе.