Импорт объекта OLE из доступа к MySQL - PullRequest
1 голос
/ 03 сентября 2008

У меня есть таблица в таблице доступа, которая содержит записи о товаре, в одном из столбцов есть изображение jpg, сохраненное как объект OLE. Я пытаюсь импортировать эту таблицу в MySQL, но, похоже, ничего не работает. Я пробовал инструмент миграции MySQL, но у него есть известная проблема с объектами Access и OLE. (Проблема в том, что он не работает и оставляет поля пустыми) Я также попробовал предложение на этом сайте и в то время как данные импортируются, кажется, что изображение становится поврежденным при передаче. Когда я пытаюсь предварительно просмотреть изображение, я просто получаю двоичное представление, если я сохраняю его на диск как изображение jpg и пытаюсь открыть его, я получаю сообщение об ошибке, указывающее, что изображение повреждено.

Изображения в Access в порядке и могут быть просмотрены. Access хранит данные как объект OLE, и когда я импортирую их в MySql, они сохраняются в поле MediumBlob.

Кто-нибудь имел эту проблему раньше и как они ее решили?

Ответы [ 3 ]

1 голос
/ 03 сентября 2008

Хорошо, поэтому в интересах выкладывания моего грязного кода на публику, вот что я придумала.
Примечание: это взлом, предназначенный для использования один раз, а затем выброшенный.

Этот метод принимает datarowview, содержащий 1 строку данных из таблицы доступа. Изображения обернуты в OLE-сериализацию, я не совсем знаком с тем, как это работает, но с тем, как приложения Microsoft позволяют встраивать любой объект во что-то другое. (например, изображения в ячейках Excel). Мне нужно было удалить ненужную сериализацию вокруг изображения, поэтому я загрузил все поле в виде массива байтов и искал в нем 3 одновременных записи (FF D8 FF), которые представляют начало данных изображения внутри поля.

    Private Function GetImageFromRow(ByRef row As DataRowView, ByVal columnName As String) As Bitmap
    Dim oImage As Bitmap = New Bitmap("c:\default.jpg")
    Try
        If Not IsDBNull(row(columnName)) Then
            If row(columnName) IsNot Nothing Then
                Dim mStream As New System.IO.MemoryStream(CType(row(columnName), Byte()))
                If mStream.Length > 0 Then

                    Dim b(Convert.ToInt32(mStream.Length - 1)) As Byte
                    mStream.Read(b, 0, Convert.ToInt32(mStream.Length - 1))

                    Dim position As Integer = 0

                    For index As Integer = 0 To b.Length - 3
                        If b(index) = &HFF And b(index + 1) = &HD8 And b(index + 2) = &HFF Then
                            position = index
                            Exit For
                        End If
                    Next

                    If position > 0 Then
                        Dim jpgStream As New System.IO.MemoryStream(b, position, b.Length - position)
                        oImage = New Bitmap(jpgStream)
                    End If
                End If
            End If
        End If
    Catch ex As Exception
        Throw New ApplicationException(ex.Message, ex)
    End Try
    Return oImage
End Function

Тогда нужно вытянуть эти данные в растровое изображение. Поэтому для каждой строки в таблице доступа я извлекаю растровое изображение, а затем обновляю соответствующую запись MySQL.
Это работало нормально, но я предполагаю, что я мог бы удалить сериализацию лучше, возможно, есть API для этого.

1 голос
/ 03 сентября 2008

Насколько я помню, Microsoft " SQL Server Migration Assistant для Access " будет правильно переносить OLE-образы, но это только для Access-> SQLServer. Однако вы можете использовать это для перехода на SQLServer Express (бесплатная загрузка), а затем для миграции с SQLServer на MySQL.

0 голосов
/ 08 апреля 2012

Существует также olefield - модуль Python для извлечения данных из полей объекта OLE в Access. Я успешно извлек файлы BMP с ним. Возможно, он может работать с изображениями в формате JPEG, но я не пробовал.

...