как создать объект ole из файла - Ms-access - PullRequest
1 голос
/ 13 июня 2011

У меня есть таблица со встроенным рисунком (OLE).

Я хочу иметь возможность вставлять новую запись через форму с опцией просмотра.

В любом случае, у меня есть имя файла, и мне нужно превратить его в объект ole и вставить в форму. как мне это сделать в VBA?

Чтобы уточнить - мне нужно превратить имя файла в объект ole с этим файлом, а затем вставить его в таблицу.

Спасибо, Fingerman.

EDIT:

Хорошо, как указал @HansUp, мне нужно объяснить. В моей форме у меня есть связанный объект OLE, который связан не с полем, а с функцией dlookup. Я получаю правильный идентификатор в контроллере с помощью запроса и поля со списком - поэтому контроллер привязан к:

=DLookUp("picture","articles","id=" & [articles])

обратите внимание, что article - это не поле, а контроллер, я не знаю, будет ли это отличаться.

Каждый раз, когда этот контроллер изменяется, я использую me.recalc, чтобы связанный OLE мог обновить его значение.

В любом случае, я подумал сделать это только VBA и пользователем, вводящим адрес файла, без использования контроллера, но с помощью какого-либо INSERT или чего-то еще, но другие варианты приветствуются.

Если мне не ясно, спросите! Я уточню и исправлюсь.

РЕДАКТИРОВАТЬ 2:

Так как получается имя файла или получен? Вы ожидаете использовать ArticleID? Картинка всегда на ожидаемое местоположение с ожидаемым имя файла? Что именно вы хотите делать, если вы не используете кнопку Обзор? Вы ищете что-то полностью автоматизированный на основе папки и файла имя или вы ищете что-то как перетаскивание?

имя файла получено через опцию просмотра, у меня оно есть. для простоты - допустим, пользователь должен сам ввести имя файла в текстовое поле. теперь - я хочу, чтобы одним нажатием кнопки я мог вставить это имя файла как внедренный объект ole - в свою базу данных. Я не ищу ни автоматизации, ни перетаскивания (но, если перетаскивание работает, это было бы здорово). Первое редактирование о контроллере ole, так как кто-то спросил. он думал, что мой вопрос может быть решен с помощью этого контроллера - поэтому я подробно рассказал о том, как я рисую картину. Я не думаю, что это имеет какое-либо отношение, но если бы кто-то мог использовать это, я бы согласился. Я ожидаю использовать articleID для обновления, но, опять же, я не понимаю, как это связано с вопросом.

Я начинаю думать, что это может быть невозможно ..... :( Это прискорбно, поскольку проблема довольно прямолинейна. у вас есть имя файла, вам нужно, чтобы оно было внедрено как объект OLE в вашей базе данных.

1 Ответ

5 голосов
/ 17 июня 2011

Прежде чем предоставить свои ответы, я хочу быстро перефразировать ваш вопрос и его требования. Для меня это звучит так, будто вы хотите иметь возможность загружать двоичные файловые объекты, в данном случае изображения, используя VBA, поле OLE Object в вашей таблице и Bound Object Frame.

Лучший вариант - перестать пытаться использовать связанный объектный фрейм, поскольку у него слишком много ограничений.

Есть два основных метода, которые вы пытаетесь сделать.

1) Сохраните только ссылку на файл изображения, а затем используйте элемент управления изображением (его можно привязать к полю изображения) для отображения изображения.

2) Сохраните изображение в поле OLE Object, используя код для считывания изображения в виде двоичных данных. Когда вам нужно отобразить изображение, вам нужно записать его во временный файл, а затем вы можете установить для свойства Picture в Image Control полный путь и имя файла для временного файла изображения. Вы можете управлять файлом изображения как временным файлом. Вы можете использовать временный каталог Windows или просто записывать в одно и то же имя файла каждый раз, когда вам нужно отобразить изображение.

Ни один из этих методов не слишком сложен. Здесь есть действительно хорошая статья, которая поможет вам лучше понять, о чем я говорю: http://www.jamiessoftware.tk/articles/handlingimages.html

Вот функция для чтения двоичных данных (в данном случае это файл изображения) и другая функция для записи двоичных данных: http://www.ammara.com/access_image_faq/read_write_blob.html Это хорошо работает для записи вашего изображения во временный файл. Затем все, что вам нужно сделать, это установить свойство Picture в вашем элементе управления изображением, указав путь к файлу и имя вашего временного файла.

Вы также можете читать и записывать двоичные данные, используя объект ADO Stream, а также объект ADO RecordSet и объект подключения ADO. Вам нужно будет установить ссылку в Библиотеке доступа к объектам данных Microsoft ActiveX 2.8.

Вот код для добавления изображений в базу данных с использованием ADO:

Private Function LoadPicIntoDatabase(sFilePathAndName As String) As Boolean
On Error GoTo ErrHandler

    'Test to see if the file exists. Exit if it does not.
    If Dir(sFilePathAndName) = "" Then Exit Function

    LoadPicIntoDatabase = True

    'Create a connection object
    Dim cn As ADODB.Connection
    Set cn = CurrentProject.Connection

    'Create our other variables
    Dim rs As ADODB.Recordset
    Dim mstream As ADODB.Stream
    Set rs = New ADODB.Recordset

    'Configure our recordset variable and open only 1 record (if one exists)
    With rs
        .LockType = adLockOptimistic
        .CursorLocation = adUseClient
        .CursorType = adOpenDynamic
        .Open "SELECT TOP 1 * FROM tblArticles", cn
    End With

    'Open our Binary Stream object and load our file into it
    Set mstream = New ADODB.Stream
    mstream.Open
    mstream.Type = adTypeBinary
    mstream.LoadFromFile sFilePathAndName

    'add a new record and read our binary file into the OLE Field
    rs.AddNew
    rs.Fields("olepicturefield") = mstream.Read
    rs.Update

    'Edit: Removed some cleanup code I had inadvertently left here.


Cleanup:
    On Error Resume Next
    rs.Close
    mstream.Close
    Set mstream = Nothing
    Set rs = Nothing
    Set cn = Nothing

    Exit Function

ErrHandler:
    MsgBox "Error: " & Err.Number & " " & Err.Description
    LoadPicIntoDatabase = False
    Resume Cleanup

End Function


Private Sub Command0_Click()
    If IsNull(Me.txtFilePathAndName) = False Then
        If Dir(Me.txtFilePathAndName) <> "" Then
            If LoadPicIntoDatabase(Me.txtFilePathAndName) = True Then
                MsgBox Me.txtFilePathAndName & " was successfully loaded into the database."
            End If
        End If
    End If
End Sub

Edit1:

Согласно вашему запросу, вот код для поиска / загрузки изображения для данной статьи. Для большей согласованности я также изменил имена таблиц и полей выше, чтобы они лучше отражали ваш проект и соответствовали приведенному ниже коду. Я проверил этот код, и он работал правильно для меня.

Private Sub Command1_Click()
    If IsNull(Me.txtArticleID) = False Then
        If DCount("articleid", "tblArticles", "articleid = " & Me.txtArticleID) = 1 Then
            Dim rs As DAO.Recordset, sSQL As String, sTempPicture As String
            sSQL = "SELECT * FROM tblArticles WHERE ArticleID = " & Me.txtArticleID
            Set rs = CurrentDb.OpenRecordset(sSQL)
            If Not (rs.EOF And rs.BOF) Then
                sTempPicture = "C:\MyTempPicture.jpg"
                Call BlobToFile(sTempPicture, rs("olepicturefield"))
                If Dir(sTempPicture) <> "" Then
                    Me.imagecontrol1.Picture = sTempPicture
                End If
            End If
            rs.Close
            Set rs = Nothing
        Else
            MsgBox "Article Not Found"
        End If
    Else
        MsgBox "Please enter an article id"
    End If
End Sub

Private Function BlobToFile(strFile As String, ByRef Field As Object) As Long
    On Error GoTo BlobToFileError

    Dim nFileNum As Integer
    Dim abytData() As Byte
    BlobToFile = 0
    nFileNum = FreeFile
    Open strFile For Binary Access Write As nFileNum
    abytData = Field
    Put #nFileNum, , abytData
    BlobToFile = LOF(nFileNum)

BlobToFileExit:
    If nFileNum > 0 Then Close nFileNum
    Exit Function

BlobToFileError:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
           "Error writing file in BlobToFile"
    BlobToFile = 0
    Resume BlobToFileExit

End Function        
...