#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 ГБ. Часто лучше оставлять вложения внешними и сохранять путь в текстовом поле.
Опции:
- примените фильтр в SQL, чтобы открыть набор записей Daorecord только с записью, которую необходимо обновить
daoDB.OpenRecordset("SELECT * FROM N_C_A WHERE ID =" amp; Me!ID, dbOpenDynaset)
- используйте метод поиска набора записей, чтобы перейти к нужной записи
daoRecordset.FindFirst "ID = " amp; Me!ID
If Not daoRecordset.NoMatch Then
'code to add attachment
End If
Комментарии:
1. Спасибо вам за ваше предложение. Рассмотрев размер вложений, я понимаю, что эти 2 Гб будут использованы довольно быстро. Я сохраню их снаружи и сохраню путь к изображению в доступе.